繁体   English   中英

执行动态 sql 查询的问题

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM