Ошибка при выполнении запроса Dynami c sql - PullRequest
0 голосов
/ 05 мая 2020

У меня есть 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 не одинаков в разных базах данных, он указывается c для каждой). Я хочу go через список предоставленных баз данных (@dbList) и выполнить каждую хранимую процедуру с данными из @mySourceTable. Я не уверен, что приведенный выше код является лучшим подходом, он не работает и выдает ошибку:

Необходимо объявить скалярную переменную «@mySourceTable».

Эта переменная уже объявлена ​​в начале скрипта. Что я делаю не так? Можно ли передать данные из @mySourceTable с помощью переменной и не создавать для нее другую таблицу (я действительно хочу этого избежать)?

1 Ответ

0 голосов
/ 05 мая 2020

Попробуйте что-то вроде этого:

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;

Когда вы выполняете оператор T- SQL с sp_executesql, вы можете передавать параметры.

...