可以以及如何在SQL中使用USE语句同时使用多个数据库?

时间:2017-09-28 20:45:57

标签: sql-server tsql while-loop

我的目标是在更新表或视图时在多个数据库中查找受影响的存储过程。我在具有多个数据库的环境中工作,这些存储过程可以存在。下面是一个可以为一个数据库做我想做的事情的查询。

如何在不必将USE语句更改为DatabaseB,DatabaseC等或涉及UNION的冗长查询的情况下实现结果?

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

我玩过循环,但无济于事。

type="submit"

2 个答案:

答案 0 :(得分:1)

如果您使用现有光标(来自第二个代码示例),并将中的查询(来自第一个代码示例)作为动态查询插入,则应该可以正常工作:

SET @SQL = '
USE ' + @DatabaseName + '

SELECT

        O.name
...'

如果您想对所有数据库运行此查询,可能更容易的解决方案是使用未记录的系统存储过程sp_msforeachdb

答案 1 :(得分:0)

我知道你不愿意使用UNION,但它对你的情况很有帮助。如果您可以使用链接服务器,则可以使用具有完全限定路径的UNION。如果可以,我还建议使用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%'

您还可以使用内存优化表方法:

https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/cross-database-queries

如果您需要为找到的每个proc执行某些操作,请将其用作Cursor的SELECT语句。

相关问题