Vin*_*c 웃 4 sql-server stored-procedures
我有40多个数据库,我想在所有使用该文本的数据库中查找程序sp_reset_data.这个查询给了我很多帮助:
DECLARE @Search varchar(255)
SET @Search='sp_reset_data'
SELECT DISTINCT
o.name AS Object_Name,o.type_desc
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id=o.object_id
WHERE m.definition Like '%'+@Search+'%'
ORDER BY 2,1
Run Code Online (Sandbox Code Playgroud)
但是,这只为当前数据库获取程序.有没有办法改进这种查询以查看每个服务器的数据库而无需手动更改当前数据库?
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + 'SELECT db = ''' + name + ''', o.name, o.type_desc
FROM ' + QUOTENAME(name) + '.sys.sql_modules AS m
INNER JOIN ' + QUOTENAME(name) + '.sys.objects AS o
ON m.[object_id] = o.[object_id]
WHERE m.definition LIKE N''%'' + @Search + ''%''
ORDER BY o.type_desc, o.name;'
FROM sys.databases
WHERE database_id > 4 AND state = 0; -- online
EXEC sp_executesql @sql, N'@Search NVARCHAR(255)', N'sp_reset_data';
Run Code Online (Sandbox Code Playgroud)
严格来说,如果你只想要程序,那就更简单了(上面还包括函数,触发器,甚至视图):
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + 'SELECT db = ''' + name + ''', o.name
FROM ' + QUOTENAME(name) + '.sys.sql_modules AS m
INNER JOIN ' + QUOTENAME(name) + '.sys.procedures AS o
ON m.[object_id] = o.[object_id]
WHERE m.definition LIKE N''%'' + @Search + ''%''
ORDER BY o.name;'
FROM sys.databases
WHERE database_id > 4 AND state = 0; -- online
EXEC sp_executesql @sql, N'@Search NVARCHAR(255)', N'sp_reset_data';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3436 次 |
| 最近记录: |