"Must declare the table variable" in while 循环



我正在编写一个脚本,以便在基表和服务器中的所有数据库之间进行比较。

我处理这种情况的方法是使用表变量。

对查询进行编码,返回预期结果,但在尝试对每个数据库执行动态查询时会出现问题。

DECLARE @myTableVariableBase TABLE (Version varchar(10),count int, dbname Varchar(50))
DECLARE @dbname VARCHAR(200)
DECLARE db_cursor CURSOR FOR 
SELECT name FROM sys.databases
WHERE name NOT IN ('databases_not_used')
INSERT INTO @myTableVariableBase SELECT Version, count(Version),'Base_Database' FROM [Base_Database].[dbo].[table] GROUP BY Version ORDER BY Version desc
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname  
WHILE @@FETCH_STATUS = 0  
BEGIN  

DECLARE @myTableVariableTarget TABLE (Version varchar(10),count int, dbname Varchar(50))

EXEC('INSERT INTO @myTableVariableTarget SELECT Version, count(Version), @dbname FROM ' + @dbname + '.[dbo].[Table]')
PRINT @dbname
SELECT * FROM @myTableVariableBase
EXCEPT
SELECT * FROM @myTableVariableTarget

FETCH NEXT FROM db_cursor INTO @dbname
END
CLOSE db_cursor  
DEALLOCATE db_cursor 

此查询返回消息

消息1087,级别15,状态2,行1必须声明表变量"@myTableVariableTarget";。消息137,级别15,状态2,第1行必须声明标量变量"@dbname";。

你有什么建议吗?

提前感谢!

表变量具有当前批处理范围。请改用临时表,该表在嵌套范围中可见,就像您的动态查询一样。

代替

DECLARE @myTableVariableTarget TABLE (Version varchar(10),count int, dbname Varchar(50))

进行

create table #myTableVariableTarget  (Version varchar(10),count int, dbname Varchar(50))

如前所述,不能使用来自不同范围的表变量。

但你不需要。你只需要创建一个完成整个任务的大脚本,然后执行它。

DECLARE @sql nvarchar(max);
SELECT @sql = STRING_AGG(CAST('
SELECT Version, count(Version), ''Base_Database''
FROM [Base_Database].[dbo].[table]
GROUP BY Version
EXCEPT
SELECT Version, count(Version), ' + QUOTENAME(d.name, '''') + '
FROM ' + QUOTENAME(d.name) + '.[dbo].[Table];
'
AS nvarchar(max)), '
'  )
FROM sys.databases d
WHERE d.name NOT IN ('databases_not_used');
EXEC sp_executesql @sql;

最新更新