SQL Server 对象搜索






4.85/5 (16投票s)
2007 年 8 月 22 日
7分钟阅读

68455

781
一个旨在模拟 Query Analyser 的 F4 对象搜索功能的应用程序。
引言
在 Chase Software,我们为核心应用程序使用自动生成的中间层,所以直到最近,我一直舒适地远离其数据源 SQL Server 2005 数据库的各种细节。然而,有时我需要了解一些我正在处理的数据库的信息,这时我沮丧地发现 SQL Server Management Studio (SSMS) 中没有任何功能与 SQL Query Analyser for SQL Server 2000 中包含的旧 Object Search 工具相似。SSMS 仅在其对象资源管理器 (Object Explorer) 上提供一个筛选功能,但这对于我希望使用旧 Object Search 功能的场景来说是极其不足的。旧工具可以搜索所有数据库中的所有对象类型,而 SSMS 的筛选功能只能应用于单个数据库中的单个对象类型!
我对 SSMS 中有限的筛选功能日益增长的沮丧和生产力的下降促使我在 SSMS 的一个外部工具中重现了旧 Object Search 工具的功能。本文和配套代码就是由此产生的。
背景
所有的搜索实际工作都由 sp_MSobjsearch
存储过程完成。我是通过运行 SQL Server 2000 版本中提供的旧 Object Search 工具时进行跟踪而获得了这一信息。此存储过程在 SQL Server 2005 中不可用,但 Query Analyser 在我第一次尝试在 2005 服务器上使用 Object Search 工具时,通过提供安装它来优雅地处理了这个问题。接受此提议会安装存储过程,并允许我像以前一样进行搜索。然而,我的应用程序要求更高一些,您需要按照我提供的 Microsoft 脚本自行安装该过程。
我使用 ObjectSearch
类来封装所有实际的搜索功能。该类管理数据访问操作和搜索结果,并公开一组用于搜索条件的属性。这些属性是 sp_MSobjsearch
存储过程所用参数的子集,因为在此版本的应用程序中,某些参数未使用。设置搜索参数属性后,调用 PerformSearch
方法会使 ObjectSearch 实例执行存储过程并存储搜索结果,这些结果通过其 Results 属性公开。
搜索参数属性的工作方式如下:
SearchKey | 要在对象名称中搜索的术语。此值可能包含常规的 T-SQL 通配符字符。调用 PerformSearch 时,如果此值为空,则会抛出异常。 |
DatabaseName | 要搜索的数据库名称。如果此值为空或 null,则搜索当前数据库。要搜索所有数据库,请将此属性设置为 '*'。 |
ObjectType | 一个位字段,指示要搜索的对象类型的组合。此值是通过对要包含在搜索中的所有对象类型的位字段值执行按位 OR 来确定的。下面将讨论对象类型。 |
@status
参数的值为 1 表示存储过程应为搜索过程的每个步骤返回一个指示其进度的结果集,但接收异步结果集不仅超出了本文的范围,也远远超出了我的 SQL Server 编程能力。因此,我也避免使用 @hitlimit
参数,因为一旦过程同步执行返回所有结果,命中限制就没有意义了。@casesensitive
参数(也是一个整数标志)指示过程执行区分大小写的搜索,这仅在区分大小写的数据库上有效。为了交付一个可在不区分大小写的数据库上运行的应用程序(我认为大多数都是如此),我已放弃在这方面进一步努力。@extpropname
和 @extpropvalue
参数指定要搜索的 SQL Server 对象扩展属性中的信息,我将在应用程序的后续版本中重新审视此功能。
使用代码
搜索表单
这是应用程序中主窗体,也是唯一的窗体。它处理搜索条件和结果,并提供执行搜索、停止搜索和清除显示以进行新搜索的命令。为了稍微多花点时间处理使用单独线程执行搜索的额外复杂性,我已将 **停止** 命令的实现推迟到应用程序的下一个版本。
虽然 SQL Query Analyser 2000 版本附带的原始 **Object Search** 工具在对象名称(搜索键)和数据库字段使用了下拉列表,但我为了尽早交付和简化,选择了单值文本框。为保持布局平衡,禁用的控件仍保留在窗体上,直到它们支持的功能在应用程序的未来版本中实现。
我使用一组 CheckBox
控件供用户选择对象类型的组合,以及一个 CheckBox
来选择或取消选择所有对象类型。在每个 CheckBox
的 Tag 属性中,我存储一个对象类型的短名称,表单代码使用此名称查找 DataProvider
类静态 ObjectTypes
属性中的 ObjectType
结构。此结构提供对象类型的位字段值,表单使用每个选定对象类型的值的总和,将其 ObjectTypes
属性值提供给 ObjectSearch
以执行搜索。
搜索完成后,表单将其 Results 属性绑定到 DataGridView
。数据网格将搜索结果显示为结果集合中每个 SearchHit 的一行,并提供列重排和排序等便利功能,但我将在应用程序的下一个版本中实现排序。
关注点
对象类型
对象类型的概念是此项目搜索功能的核心。对象类型指定搜索哪些对象,并指示搜索结果中返回的对象类型。从 sp_MSobjsearch
存储过程返回的对象类型值都对应于 sys.objects
目录视图返回的对象类型值,除了 'COL
' 和 'I
' 类型,分别表示列或索引。原始 Object Search 工具似乎会进行一些处理,用更长、更具描述性的名称替换搜索过程返回的短对象类型名称。我使用了 SQL Server 文档中 sys.objects
视图给出的长类型名称。使用的对象类型列在附录 I 中。
搜索过程接受一个整数,该整数表示要搜索的对象类型,由代表每个对象类型的 2n 位字段值的组合构成。这些值在 sp_MSobjsearch
过程的脚本顶部注释中给出。其中有两个类型未在原始工具中使用,因此我也不将它们包含在此版本的应用程序中。使用这些值的一个例子是搜索用户表和视图中的列。位字段值分别是列的 1024,用户表的 1,视图的 4,如果我对这些值进行按位 OR,则对象类型参数值为 1029。
我使用一个名为 SqlObjectType
的结构来表示上述对象类型的一个实例,并通过 DataProvider
类静态 ObjectTypes
属性公开 SqlObjectType
对象的集合。该类的静态构造函数使用对象类型属性的字面值初始化集合。对于原始 Object Search 工具不支持的对象类型,我只使用零值。我最终会修改此代码,以便从 XML 文件等外部资源读取对象类型定义。
UI 为每个支持的对象类型提供一个 Checkbox
控件,以及一个用于选择所有对象类型的控件。我将每个 CheckBox
的 Tag
属性设置为其所代表的对象类型的短名称,这使我能够使用此名称作为键从 DataProvider 类中获取位字段值。这样,我就可以遍历所有 CheckBox
控件,将这些值相加,从而为搜索过程获得对象类型参数值。对于如何更好地处理位字段和 CheckBox
控件的此类场景,我欢迎提出建议。
历史
这是 v1.0。根据反馈,修订版将很快发布。