【问题标题】:SQL Server query combine cursor outputSQL Server 查询组合游标输出
【发布时间】:2022-01-22 18:50:20
【问题描述】:

我想将此查询的输出合并到一个表中,我应该使用 join/union 还是其他什么?

DECLARE @name VARCHAR(1000)

DECLARE db_cursor CURSOR FOR 
SELECT name FROM MASTER.dbo.sysdatabases 

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @name  

WHILE @@FETCH_STATUS = 0  
BEGIN  
      select getdate() as [Date Time], DEFAULT_DOMAIN()[Domain], SERVERPROPERTY('MachineName') AS Server,@@servername as [Instance],@name AS [Database], *
      from sys.sysprocesses  

      FETCH NEXT FROM db_cursor INTO @name 
END 

CLOSE db_cursor  
DEALLOCATE db_cursor

【问题讨论】:

  • SQL Server 2012
  • 合并如何?在询问 SQL 问题时,minimal reproducible example 是一个很好的开始。
  • 您是否认为上述查询将遍历您实例上的每个数据库?它不会。实际上,它将多次对 same 数据库运行相同的查询;一次用于您拥有的数据库数量,但查询的数据库不会有所不同。
  • 另外,你为什么使用sys.sysprocessessys.sysdatabases?这些表是为了与 SQL Server 2000 数据库兼容。见documentation
  • 为什么要使用游标(或任何循环)来执行此操作?仅使用单个查询要容易一个数量级(并且更快)。哎呀,内部查询中甚至没有 WHERE 子句,所以它只会在每个“行”中返回相同的内容。

标签: sql sql-server-2012 database-cursor


【解决方案1】:

可以使用变量表和临时表来解决。我使用了一个变量表,您可以添加任意数量的列。

DECLARE @process_table TABLE (
    [Date Time] datetime  NULL,
    Domain varchar(max) NULL,
     [Server] sql_variant NULL,
      Instance varchar(max) NULL,
       [Database] varchar(max) NULL 
);

DECLARE @name VARCHAR(1000)

DECLARE db_cursor CURSOR FOR 
SELECT name FROM MASTER.dbo.sysdatabases 

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @name  

WHILE @@FETCH_STATUS = 0  
BEGIN  
      Insert into @process_table([Date Time],Domain,[Server],Instance,[Database])
      select getdate() as [Date Time], DEFAULT_DOMAIN()[Domain], SERVERPROPERTY('MachineName') AS Server,@@servername as [Instance],@name AS [Database]
      from sys.sysprocesses

      FETCH NEXT FROM db_cursor INTO @name 
END 

CLOSE db_cursor  
DEALLOCATE db_cursor

Select * from @process_table

【讨论】:

  • 这会有我在comments 中提到的同样的问题;它将针对 same 数据库 多次运行 same 查询。那有什么意义呢?如果您想要每个数据库一行的查询,您不妨使用CROSS JOIN 并将CURSOR 装箱。
  • 它将每个数据库进程的行推送到一个表中我认为这就是问题所在!
  • “它将推送每个数据库进程的行” 错误。它将一个数据库进程的行“推送”到一张表很多次; Database 列中的值每次都会改变。再说一次,如果你想这样,你也可以CROSS JOINsys.databases(也不是sys.sysdatabaseslike I mentioned)。
  • 我想把不同表的输出放在一个表中,也许是 WHILE LOOP 的东西?
  • 你需要在查询中解释你真正想要什么,@Rednirug。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多