Sql server 在SQL中,我可以并且如何使用use语句同时使用多个数据库?
我的目标是在更新表或视图时跨多个数据库查找受影响的存储过程。我在一个有多个数据库的环境中工作,这些存储过程可以存在。下面是一个查询,可以为一个数据库执行我想要的操作 如何在不必将USE语句更改为DatabaseB、DatabaseC等或涉及联合的冗长查询的情况下获得结果Sql server 在SQL中,我可以并且如何使用use语句同时使用多个数据库?,sql-server,tsql,while-loop,Sql Server,Tsql,While Loop,我的目标是在更新表或视图时跨多个数据库查找受影响的存储过程。我在一个有多个数据库的环境中工作,这些存储过程可以存在。下面是一个查询,可以为一个数据库执行我想要的操作 如何在不必将USE语句更改为DatabaseB、DatabaseC等或涉及联合的冗长查询的情况下获得结果 USE DatabaseA SELECT O.name , O.type_desc , M.definition FROM sys.sql_modules M LEFT JOIN
USE DatabaseA
SELECT
O.name
, O.type_desc
, M.definition
FROM sys.sql_modules M
LEFT JOIN sys.objects O
ON O.object_id = M.object_id
WHERE 1=1
AND definition LIKE '%Error%'
我玩过循环,但没用
DECLARE name_Cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
OPEN name_Cursor;
FETCH NEXT FROM name_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM name_Cursor;
END;
CLOSE name_Cursor;
DEALLOCATE name_Cursor;
GO
如果从第二个代码示例中获取现有游标,并将第一个代码示例中的查询作为动态查询插入,则它应该可以工作:
SET @SQL = '
USE ' + @DatabaseName + '
SELECT
O.name
...'
如果您希望对所有数据库运行此查询,一个可能更简单的解决方案是使用未记录的系统存储过程。我知道您不愿意使用联合,但它对您的情况会有所帮助。如果您有使用链接服务器的特权,那么可以使用具有完全限定路径的联合。如果可以的话,我还建议您使用INFORMATION_SCHEMA.ROUTINES
SELECT ROUTINE_NAME FROM [DB1].[dbo].INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%Error%'
UNION ALL
SELECT ROUTINE_NAME FROM [DB2].[dbo].INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%Error%'
您还可以使用内存优化表方法:
如果需要对找到的每个进程执行某些操作,请将其用作游标的SELECT语句