簡體   English   中英

SELECT while 循環中的語句不工作

[英]SELECT statement in while loop isn't working

我創建了以下運行良好的 Select 語句:

SELECT @Block = [Blok], @Year = [Aar] 
FROM [PT99991_Result].[dbo].[Testheader] 
WHERE N = @TestHeaderID

問題是這個Select語句用在While循環中,其中數據庫可以在循環期間更改為另一個。 我試圖將聲明修改為以下內容,但它不起作用。 我也嘗試過使用EXEC來解決我的問題,但后來我遇到了局部變量@Block@Year的問題。

SET @DataBase = 'PT99991_RESULT' --This is only for test!

SELECT @Block = [Blok], @Year = [Aar] 
FROM '[' + @DataBase + '].[dbo].[Testheader]' 
WHERE N = @TestHeaderID

我不確定我做錯了什么?

首先,生成一個像這樣的 T-SQL 模板:

DECLARE @DynamicTSQLStatement NVARCHAR(MAX) = N'SELECT @Block = [Blok], @Year = [Aar] 
                                                FROM [@DataBase].[dbo].[Testheader] 
                                                WHERE N = @TestHeaderID';

然后,假設變量@Datbase包含您當前的數據庫名稱。 如果它不是從sys.database中提取的,您可以執行額外的驗證以確保沒有人做錯什么。

IF NOT EXISTS(SELEFT 1 FROM sys.database WHERE [name] = @Datbase
BEGIN
    ....
END;

驗證后,您只需替換模板中的數據庫名稱:

SET @DynamicTSQLStatement = REPLACE(@DynamicTSQLStatement, '@Database', @Database);

然后,執行傳遞參數的代碼:

EXEC sp_executesql @DynamicTSQLStatement
                  ,N'@TestHeaderID INT'
                  ,N'@Block INT OUTPUT'
                  ,N'@Year INT OUTPUT'
                  ,@TestHeaderID
                  ,@Block OUTPUT
                  ,@Year OUTPUT;

當然,在每次循環迭代中,重置模板。

代替 while 循環,您可以 go 用於未記錄的存儲過程:ms_foreachdb 並針對數據庫執行,最后為特定數據庫應用過濾器。

警告:不要在生產代碼中使用它,因為它使用未記錄的存儲過程。

CREATE TABLE #test(dbname sysname, blok int, aar int)
DECLARE @db_list NVARCHAR(max) = 'DB1,DB2'

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; declare @blok int, @aar int; INSERT INTO #test SELECT db_name(), blok, aar from [dbo].[Testheader] WHERE N = TestHeaderId;'

SELECT * FROM #test where dbname in 
(
SELECT value FROM string_split(@db_list,',')
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM