Вложенный цикл через базы данных в цикле - PullRequest
0 голосов
/ 18 марта 2019

У меня есть 4 одинаковые базы данных

('User1','User2','User3','User4')

И цикл, выполняющий то, что должен делать:

DECLARE @json NVARCHAR(2000)
DECLARE @getid CURSOR

SET @getid = CURSOR FOR
SELECT [custom_data] FROM [User1].[usr].[table] where [custom_data] like '%:true%' or [custom_data] like '%:false%'

OPEN @getid
FETCH NEXT
FROM @getid INTO @json
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT JSON_MODIFY(@json, '$.field','value')
FETCH NEXT FROM @getid INTO @json
END

CLOSE @getid
DEALLOCATE @getid

Мой вопрос: как перебирать базы данных?Я попытался вложить цикл, содержащий переменную с именем базы данных, а затем выполнить запрос следующим образом:

Сначала я:

DECLARE C CURSOR FOR SELECT name FROM sysdatabases WHERE name IN ('User1','User2','User3','User4')

, как описано во многих примерах, и после этого я хотел конкататьвведите имя db в запрос и выполните его следующим образом:

DECLARE @dbname varchar(50)
DECLARE C CURSOR FOR SELECT name FROM sysdatabases 
WHERE name IN ('User1','User2','User3','User4')
OPEN C
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('DECLARE @json NVARCHAR(2000);
DECLARE @getid CURSOR; SET @getid = CURSOR FOR SELECT [custom_data] FROM '+@dbName+'.[usr].[transactions]

OPEN @getid;
FETCH NEXT;
FROM @getid INTO @json;
WHILE @@FETCH_STATUS = 0;
BEGIN;
SELECT JSON_MODIFY(@json, ''$.Field'',''Value'');

FETCH NEXT FROM @getid INTO @json
END
CLOSE @getid
DEALLOCATE @getid')
FETCH NEXT FROM C INTO @dbname
END
CLOSE C
DEALLOCATE C

, но завершается цикл без ошибок с массажем

Команды успешно выполнены.

но это ничего не меняет.Буду признателен за вашу помощь

1 Ответ

0 голосов
/ 18 марта 2019

Прежде чем вы сможете выполнить оператор в контексте определенной базы данных в ad-hoc sql, вы должны выполнить оператор USE следующим образом (не пропускайте инструкцию GO, иначе она не будет работать):

SET @sql = 'USE '+@dbname+';'+CHAR(13)+CHAR(10)+'GO'+CHAR(13)+CHAR(10)+'SELECT DB_NAME();'

Кроме того, не забудьте использовать FETCH NEXT FROM C INTO @dbname до , также начните свой WHILE, иначе ваше @dbname не будет содержать пригодного для использования значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...