首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql数据库写入

sql数据库写入
EN

Stack Overflow用户
提问于 2022-09-15 10:04:40
回答 2查看 56关注 0票数 0

在这里,我想使用while循环在多个数据库上运行相同的查询。

  1. 我创建了一个名为“@
  2. ”的表,并在其中添加了要遍历的数据库的名称,其中使用
  3. 循环遍历数据库名称,以便在每个数据库

中运行特定的查询。

它没有工作。(它为SQL管理工作室左侧下拉列表中的数据库运行了两次)

两个数据库中的表是相同的。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-15 10:47:43

即使在你纠正了你已经拥有的排字之后,它也不会那样工作。在使用dbName之后,它将需要在同一连接上处于不同批处理中的GO或是GO。相反,您可以将其写为:

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2022-09-15 11:59:43

USE在这里不工作,因为动态批处理是一个不同的范围。您需要将整个SELECT放入动态SQL中。

但是你根本不需要一个WHILE。只需创建一个大型UNION ALL查询并运行它。

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73729206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档