使用免费的dbForge搜索实用程序在MS SQL Server数据库中搜索数据和对象

描述在数据库中查找数据和对象的一般需求


搜索数据以及数据库中的存储过程,表和其他对象是一个相当相关的问题,包括C#开发人员以及.NET开发人员。

经常会出现一种情况,您需要查找:

  1. 数据库对象(表,视图,存储过程,函数等)
  2. 数据(值和表所在的位置)
  3. 数据库对象定义中的代码片段

有许多现成的解决方案,包括付费和免费的。

首先,我们将研究如何使用内置的DBMS工具在数据库中搜索数据和对象,然后我们将研究如何使用免费的dbForge Search实用程序来执行此操作。

使用内置的DBMS工具进行搜索


您可以使用以下脚本确定Employee表是否在数据库中:

按名称搜索表
select [object_id], [schema_id], schema_name([schema_id]) as [schema_name], [name], [type], [type_desc], [create_date], [modify_date] from sys.all_objects where [name]='Employee'; 


结果可能是这样的:



显示如下:

  1. 对象的标识符以及对象所在的方案
  2. 该电路的名称和该对象的名称
  3. 对象的类型及其描述
  4. 创建对象的日期和时间以及上次修改的时间

要查找所有出现的“ Project”行,可以使用以下脚本:

通过名称中的子字符串搜索所有对象
 select [object_id], [schema_id], schema_name([schema_id]) as [schema_name], [name], [type], [type_desc], [create_date], [modify_date] from sys.all_objects where [name] like '%Project%'; 


结果可能是这样的:



从结果中可以看到,这里的子字符串“ Project”不仅包含两个表Project和ProjectSkill,还包含一些主键和外键。

要了解这些键到底属于谁,我们添加了parent_object_id字段及其名称以及其所在的方案,如下所示:

通过名称中的子字符串搜索所有对象以及父对象的输出
 select ao.[object_id], ao.[schema_id], schema_name(ao.[schema_id]) as [schema_name], ao.parent_object_id, p.[schema_id] as [parent_schema_id], schema_name(p.[schema_id]) as [parent_schema_name], p.[name] as [parent_name], ao.[name], ao.[type], ao.[type_desc], ao.[create_date], ao.[modify_date] from sys.all_objects as ao left outer join sys.all_objects as p on ao.[parent_object_id]=p.[object_id] where ao.[name] like '%Project%'; 


结果将是一个表,其中包含有关父对象的详细信息,即定义了主键和外键的位置:



在查询中使用以下系统对象:


因此,我们找出了如何使用内置的DBMS工具在数据库中查找对象。
现在,我们展示如何使用字符串搜索示例在数据库中查找数据。

要查找所有数据库表的字符串值,可以使用以下解决方案 。 我们简化了该解决方案,并显示了如何使用以下脚本查找“ Ramiro”的值:

在所有数据库表中按子字符串搜索字符串值
 set nocount on declare @name varchar(128), @substr nvarchar(4000), @column varchar(128) set @substr = '%Ramiro%' declare @sql nvarchar(max); create table #rslt (table_name varchar(128), field_name varchar(128), [value] nvarchar(max)) declare s cursor for select table_name as table_name from information_schema.tables where table_type = 'BASE TABLE' order by table_name open s fetch next from s into @name while @@fetch_status = 0 begin declare c cursor for select quotename(column_name) as column_name from information_schema.columns where data_type in ('text', 'ntext', 'varchar', 'char', 'nvarchar', 'char', 'sysname', 'int', 'tinyint') and table_name = @name set @name = quotename(@name) open c fetch next from c into @column while @@fetch_status = 0 begin --print 'Processing table - ' + @name + ', column - ' + @column set @sql='insert into #rslt select ''' + @name + ''' as Table_name, ''' + @column + ''', cast(' + @column + ' as nvarchar(max)) from' + @name + ' where cast(' + @column + ' as nvarchar(max)) like ''' + @substr + ''''; print @sql; exec(@sql); fetch next from c into @column; end close c deallocate c fetch next from s into @name end select table_name as [Table Name], field_name as [Field Name], count(*) as [Found Mathes] from #rslt group by table_name, field_name order by table_name, field_name drop table #rslt close s deallocate s 


执行的结果可能是这样的:



表名显示在此处,包含子字符串“ Ramiro”的值存储在列中。 以及为找到的表列对找到的此子字符串的输入数。

要查找具有给定代码段的定义中的对象,可以使用以下系统视图:

  1. sys.sql_modules
  2. sys.all_sql_modules
  3. sys.syscomments

例如,使用最后一个视图,可以使用以下脚本在定义中找到给定代码片段的所有对象:

在数据库对象定义中搜索代码片段
 select obj.[object_id], obj.[name], obj.[type_desc], sc.[text] from sys.syscomments as sc inner join sys.objects obj on sc.[id]=obj.[object_id] where sc.[text] like '%code snippet%'; 


对象的标识符,名称,描述和完整定义将在此处显示。

使用免费的dbForge搜索实用程序进行搜索


但是,使用现成的好的工具进行搜索更方便。 dbForge Search就是这样一种工具。

要在SSMS窗口中调用此实用程序请单击按钮

将出现以下搜索框:



注意顶部面板(从左到右):

  1. 您可以切换搜索模式(查找DDL(对象)或数据)
  2. 直接寻找我们想要的(哪个子字符串)
  3. 是否区分大小写,搜索精确的单词匹配,搜索出现的词:


  4. 按对象类型分组结果-按钮
  5. 选择要搜索的必要对象类型:

  6. 您还可以指定几个数据库来搜索和选择MS SQL Server的实例

这全部处于对象搜索模式,即启用DDL时:



在数据搜索模式下,仅对象类型的选择将更改:



即,只有表可供选择,数据本身存储在其中:



现在,像以前一样,我们将在对象名称中找到所有出现的“ Project”子字符串:



如您所见,已选择了DDL对象的搜索模式,它填充了我们正在寻找的“ Project”行,其余的默认情况下都是如此。

突出显示找到的对象时,该对象或其整个父对象的定义代码显示在下面。

您还可以通过单击按钮将导航移动到找到的对象



您还可以按对象类型对找到的对象进行分组:



请注意,即使在那些表中也显示了一些名称包含子字符串“ Project”的字段。 但是,请记住可以更改搜索模式:搜索是否完全符合/部分/区分大小写。

现在,我们在所有表中找到值“ Ramiro”:



请注意,包含所选Employee表的“ Ramiro”子字符串的所有行都显示在下面。

您还可以像以前一样通过按按钮将导航移动到找到的对象



因此,我们可以在数据库中搜索必要的对象和数据。

结论


既使用MS SQL Server DBMS本身的内置工具,又使用免费的dbForge Search实用程序检查了搜索数据本身和数据库中对象的方式。

Devart还提供了许多其他免费的现成解决方案,可在此处找到其完整列表。

资料来源


Source: https://habr.com/ru/post/zh-CN475212/


All Articles