在这里,我想使用while循环在多个数据库上运行相同的查询。
中运行特定的查询。
它没有工作。(它为SQL管理工作室左侧下拉列表中的数据库运行了两次)
两个数据库中的表是相同的。
DECLARE @database TABLE (id INT,name varchar(50))
insert into @database values (1, 'Databse_one'), (2, 'Database_two')
DECLARE @cnt INT =2, @int INT=1,@dbname NVARCHAR(MAX)
while(@int <=@cnt)
begin
select @dbname='use '+name from @database
where id=@int
EXEC sp_sqlexec @dbname
select top 10 db_name() DB_NAME, req_number, record Type,order_date from ORDER_DOCUMENT order by order_date desc
set @int = @int+1
end发布于 2022-09-15 10:47:43
即使在你纠正了你已经拥有的排字之后,它也不会那样工作。在使用dbName之后,它将需要在同一连接上处于不同批处理中的GO或是GO。相反,您可以将其写为:
DECLARE @database TABLE(id INT, name VARCHAR(50));
INSERT INTO @database VALUES(1, 'Databse_one'), (2, 'Database_two');
DECLARE @cnt INT=2, @int INT=1, @dbname NVARCHAR(MAX);
WHILE(@int<=@cnt)BEGIN
SELECT @dbname=name FROM @database WHERE id=@int;
DECLARE @sql NVARCHAR(MAX);
SET @sql=N'select top(10) '''+@dbname+N''',req_number, record Type,order_date from '+QUOTENAME(@dbname)+N'.dbo.ORDER_DOCUMENT order by order_date desc;';
EXEC sys.sp_executesql @stmt=@sql;
SET @int=@int+1;
END;发布于 2022-09-15 11:59:43
USE在这里不工作,因为动态批处理是一个不同的范围。您需要将整个SELECT放入动态SQL中。
但是你根本不需要一个WHILE。只需创建一个大型UNION ALL查询并运行它。
DECLARE @database TABLE(name sysname);
INSERT INTO @database(name) VALUES(1, );
DECLARE @sql nvarchar(max);
SELECT @sql = 'SELECT *
FROM (
' + STRING_AGG(CAST('
SELECT TOP (10)
' + QUOTENAME(d.name, '''') + ' DB_NAME,
req_number,
record Type,
order_date
FROM ' + + QUOTENAME(d.name) + '..ORDER_DOCUMENT
ORDER BY
order_date DESC
' AS nvarchar(max)), '
') + '
);
'
FROM sys.databases d
WHERE d.name IN ('Databse_one', 'Database_two');
EXEC sp_executesql @sql;或者,如果您想要单独的SELECT语句,那么删除UNION ALL
DECLARE @database TABLE(name sysname);
INSERT INTO @database(name) VALUES(1, );
DECLARE @sql nvarchar(max);
SELECT @sql = STRING_AGG(CAST('
SELECT TOP (10)
' + QUOTENAME(d.name, '''') + ' DB_NAME,
req_number,
record Type,
order_date
FROM ' + + QUOTENAME(d.name) + '..ORDER_DOCUMENT
ORDER BY
order_date DESC;
' AS nvarchar(max)), '
')
FROM sys.databases d
WHERE d.name IN ('Databse_one', 'Database_two');
EXEC sp_executesql @sql;https://stackoverflow.com/questions/73729206
复制相似问题