Sql server 在SQL中,我可以并且如何使用use语句同时使用多个数据库?

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语句更改为DatabaseB、DatabaseC等或涉及联合的冗长查询的情况下获得结果

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语句