嵌套循环遍历数据库

时间:2019-03-18 12:20:06

标签: sql sql-server

我有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')

如许多示例中所述,此后,我想将数据库名称连接到查询中并像这样执行它:

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 :(得分:0)

在临时sql中可以在特定数据库的上下文中执行语句之前,必须执行这样的USE语句(不要省略GO指令,否则它将无法工作):

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

此外,也不要忘记在C到@dbname之前使用下一个FETCH NEXT 开始之前,否则您的@dbname将不包含可用值。