У меня есть 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
с помощью переменной и не создавать для нее другую таблицу (я действительно хочу этого избежать)?