CREATE PROC sp_FindObject
@objectname sysname, --要查找的对象名
@whereand nvarchar(2000)=N'', --数据库的过滤条件
@operator nchar(2)=N'=' --查找对象的运算符
AS
SET NOCOUNT ON
--保存搜索结果的临时表
CREATE TABLE #(DatabaseName sysname,ObjectName sysname,Type sysname)
--定义 sp_MSforeach_worker 检索数据使用的游标
IF @whereand IS NULL SET @whereand=''
EXEC('
DECLARE hCForEach CURSOR GLOBAL
FOR
SELECT name FROM master.dbo.sysdatabases
WHERE HAS_DBACCESS(name)=1
'+@whereand
)
DECLARE @sql nvarchar(4000)
SET @sql=N'INSERT # SELECT N''?'',name,Type=CASE xtype
WHEN N''C'' THEN N''CHECK约束''
WHEN N''TF'' THEN N''表函数''
WHEN N''D'' THEN N''默认值或DEFAULT约束''
WHEN N''TR'' THEN N''触发器''
WHEN N''F'' THEN N''FOREIGN KEY约束''
WHEN N''U'' THEN N''用户表''
WHEN N''L'' THEN N''日志''
WHEN N''V'' THEN N''视图''
WHEN N''FN'' THEN N''标量函数''
WHEN N''X'' THEN N''扩展存储过程''
WHEN N''IF'' THEN N''内嵌表函数''
WHEN N''R'' THEN N''规则''
WHEN N''P'' THEN N''存储过程''
WHEN N''PK'' THEN N''PRIMARY KEY 约束''
WHEN N''RF'' THEN N''复制筛选存储过程''
WHEN N''UQ'' THEN N''UNIQUE约束''
WHEN N''S'' THEN N''系统表''
ELSE N''未知'' END
FROM [?].dbo.sysobjects
WHERE name '
+CASE
WHEN @operator IN('=','>','>=','!>','<','<=','!<','<>','!=')
THEN @operator+QUOTENAME(@objectname,'''')
WHEN @operator='IN'
THEN @operator+N' IN('+QUOTENAME(@objectname,'''')+')'
WHEN @operator IN('LIKE','%')
THEN ' LIKE '+QUOTENAME(@objectname,'''')
ELSE '='+QUOTENAME(@objectname,'''')
END
EXEC sp_MSforeach_worker @command1=@sql
SELECT * FROM #