[英]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.