在SQL Server中查找对象(跨数据库)

Mar*_*ret 21 sql-server sql-server-2005

如果我被告知一个表(或proc)名称,但没有告诉该对象所在的连接数据库,是否有任何简单的脚本来搜索它?也许搜索系统数据库中的某个地方?(我正在使用SQL Server 2005)

Raj*_*ore 35

有一个Information_Schema模式,它是来自SYS模式的表的一组视图,您可以查询这些视图以获得所需的内容.

Information_Schema的缺点是您必须为每种类型的对象编写一个查询.好处是Information_Schema也更友好.

Sys架构最初看起来有点神秘,但它在一个地方有相同的信息.

基本上,每个数据库中都有一个名为SysObjects的表,其中包含所有对象及其类型的名称.

因此,您希望在数据库中搜索如下:

Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
and [Name] like '%YourObjectName%'
Run Code Online (Sandbox Code Playgroud)

现在,如果你想限制它只搜索表和存储过程,你会这样做

Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
and [Name] like '%YourObjectName%'
and Type in ('U', 'P')
Run Code Online (Sandbox Code Playgroud)

如果查找对象类型,您将找到视图,触发器等的完整列表.

现在,如果要在每个数据库中搜索此内容,则必须遍历数据库.您可以执行以下操作之一:

如果要在没有任何子句的情况下搜索每个数据库,请使用sp_MSforeachdb,如此处的答案所示.

如果您只想搜索特定数据库,请使用"USE DBName"然后搜索命令.

在这种情况下,让它参数化将使您受益匪浅.请注意,您要搜索的数据库的名称必须在每个查询中被替换(DatabaseOne,DatabaseTwo ...).看一下这个:

Declare @ObjectName VarChar (100)

Set @ObjectName = '%Customer%'

Select 'DatabaseOne' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseOne.Sys.Objects
Where 1=1
and [Name] like @ObjectName
and Type in ('U', 'P')
UNION ALL
Select 'DatabaseTwo' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseTwo.Sys.Objects
Where 1=1
and [Name] like @ObjectName
and Type in ('U', 'P')
UNION ALL
Select 'DatabaseThree' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseThree.Sys.Objects
Where 1=1
and [Name] like @ObjectName
and Type in ('U', 'P')
Run Code Online (Sandbox Code Playgroud)

  • @itsho,如果宇宙破裂,Raj More不想浪费时间运行数据库查询.:) (4认同)
  • @itsho是代码可读性.每个AND都在一个单独的行上,虽然它在SO显示代码的方式上并不明显,但它们通常会缩进.此外,它使评论任何/所有条件变得更加容易.如果没有1 = 1,则无法在不删除下一行的"AND"的情况下注释掉第一个条件.因此,它不会影响查询,但会使运行该命令的用户更容易. (4认同)

And*_*ija 11

sp_MSforeachdb 'select db_name(), * From ?..sysobjects where xtype in (''U'', ''P'') And name = ''ObjectName'''
Run Code Online (Sandbox Code Playgroud)

而不是'ObjectName'插入您正在寻找的对象.第一列将显示对象所在的数据库的名称.

  • db_name()是当前数据库,''?''将是要搜索的数据库.因此,如果您需要知道对象正在使用哪个数据库,则第一列对于所有记录都是相同的:sp_MSforeachdb'select''?'',*From?.. sysobjects其中xtype in(''U'', ''P'')和name =''ObjectName''' (9认同)