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)
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'插入您正在寻找的对象.第一列将显示对象所在的数据库的名称.