[英]Issue executing Dynamic sql query
我有一组要跨多个数据库执行的指令 SQL。 我目前有以下 SQL 代码:
USE Database1
DECLARE @mySourceTable AS [someUserDefinedType];
/*Execute set of operations on Database 1 and @mySourceTable*/
DECLARE @dbList TABLE (DBName nvarchar(50));
INSERT INTO @dbList (DBName)
VALUES('Database2'),('Database3');
DECLARE @dbName nvarchar(50);
DECLARE dbCursor CURSOR FOR SELECT DBName FROM @dbList;
OPEN dbCursor;
FETCH NEXT FROM dbCursor INTO @dbName;
WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE('USE ' + @dbName + N';
DECLARE @content AS [someUserDefinedType];
INSERT INTO @content (ID)
SELECT ID FROM '+ @mySourceTable + N';
EXECUTE dbo.someProcedure @content;');
FETCH NEXT FROM dbCursor INTO @dbName;
END;
CLOSE dbCursor;
DEALLOCATE dbCursor;
基本上我想做以下事情:我有几个数据库,它们都具有相同的[someUserDefinedType]
表类型(具有相同的结构)和一个名为dbo.someProcedure
的过程,它接收所述类型的表作为参数( dbo.someProcedure
不同的数据库是不一样的,它是特定于每个数据库的)。 我想通过提供的数据库列表( @dbList
) go 并使用来自@mySourceTable
的数据执行每个存储过程。 我不确定上面的代码是否是最好的方法,它不起作用并给出错误:
必须声明标量变量“@mySourceTable”。
此变量已在脚本开头声明。 我究竟做错了什么? 是否可以使用变量从@mySourceTable
传递数据而不为它创建另一个表(我真的想避免这种情况)?
尝试这样的事情:
USE Database1
DECLARE @mySourceTable AS [someUserDefinedType];
/*Execute set of operations on Database 1 and @mySourceTable*/
DECLARE @dbList TABLE (DBName nvarchar(50));
INSERT INTO @dbList (DBName)
VALUES('Database2'),('Database3');
DECLARE @dbName nvarchar(50);
DECLARE dbCursor CURSOR FOR SELECT DBName FROM @dbList;
OPEN dbCursor;
FETCH NEXT FROM dbCursor INTO @dbName;
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
WHILE @@FETCH_STATUS = 0
BEGIN
SET @DynamicTSQLStatement = N'
USE ' + @dbName + ';
DECLARE @content AS [someUserDefinedType];
INSERT INTO @content (ID)
SELECT ID FROM @mySourceTable;
EXECUTE dbo.someProcedure @content;';
FETCH NEXT FROM dbCursor INTO @dbName;
EXEC sp_executesql @DynamicTSQLStatement, N'@mySourceTable someUserDefinedType readonly', @mySourceTable = @mySourceTable
END;
CLOSE dbCursor;
DEALLOCATE dbCursor;
当您使用sp_executesql
执行 T-SQL 语句时,您可以传递参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.