首页 > 解决方案 > while 循环中的 SELECT 语句不起作用

问题描述

我创建了以下运行良好的 Select 语句:

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

问题是该Select语句用于While循环中,其中数据库可以在循环期间更改为另一个。我试图将语句修改为以下内容,但它不起作用。我也尝试过使用EXECwhich 来解决我的问题,但后来我遇到了局部变量的问题,@Block@Year不是。

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

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

我不确定我做错了什么?

标签: sqlsql-servertsql

解决方案


而不是while循环,您可以使用未记录的存储过程: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,',')
)

推荐阅读