跨多个数据库运行查询

时间:2016-06-06 16:48:10

标签: sql sql-server cursor

我最近问了一个question关于创建一个查询,该查询会在单独的表中记录测试查询的结果。

然而,在上一个问题中,我没有提到过一件事,似乎只是简单地提出一个新话题就足够了。此查询(由Steve Mangiameli提供):

DECLARE @testStatus NVARCHAR(MAX);

IF (
    SELECT COUNT(*)
    FROM Table1
    WHERE Table1.Column1 = ''
) = 0
    SET @testStatus = 'Test Passed'
ELSE
    SET @testStatus = 'Test Failed'

INSERT INTO Table2 (FileName, Date, Result)
VALUES ('File1', GetDate(), @testStatus)

需要跨多个数据库运行。这是我使用我的另一个查询编写的当前版本,它做了类似的事情,但这个版本不起作用。 编辑:更清楚,我收到一条错误消息“必须声明标量变量”@testStatus“。

DECLARE @dbname NVARCHAR(200);
DECLARE @testStatus NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);

DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE name LIKE '%DBTag%'

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname

WHILE @@FETCH_STATUS = 0

BEGIN

SET @query = CAST('
IF (
    SELECT COUNT(*)
    FROM [' +@dbname+ '].dbo.Table1
    WHERE [' +@dbname+ '].dbo.Table1.Column1  = ''''
) = 0
    SET @testStatus = ''Test Passed''
ELSE
    SET @testStatus = ''Test Failed''

INSERT INTO [Database].dbo.Table2(FileName, Result, Date)
VALUES (''File1'', @testStatus, GETDATE())'
AS NVARCHAR(MAX))

EXECUTE (@query)

FETCH NEXT FROM db_cursor INTO @dbname

END
CLOSE db_cursor
DEALLOCATE db_cursor;

我想知道是否有一些基本上“错误”的东西,我甚至试图做这项工作。

1 个答案:

答案 0 :(得分:1)

变量在动态sql之外声明。当动态sql执行时,你的变量超出了范围。您可以通过在动态sql中再次声明变量来轻松解决此问题。

int selectedID = (int)OrganisationType_ComboBox.SelectedValue;