T-SQL查询将结果返回到单个表

时间:2016-06-10 14:06:55

标签: sql-server tsql

我正在针对实例中的所有数据库运行查询。有一些数据库具有相同的模式(表和所有)。

这是查询:

EXEC sp_MSforeachdb 'Use ? SELECT top 1  Column1, Column2 from [TableName]where Column3 = ''SpecificValue'' order by Column4 desc'

查询工作正常并返回我想要的结果,但不是我想要的结果。

运行此查询后,在结果窗格中,每个数据库都会得到一个迷你表格,所以我最终得到了一些数据库。这是非常不切实际的,它迫使我逐个复制结果。

enter image description here

有没有办法重写此查询,以便它将所有结果返回到包含2列的表中。我希望每一行都像

第1列的值来自db 1 \ column2的值d来自db1

第2列的值来自db 2 \ column2的值d来自db2

第3列的值来自db 3 \ column of column2 d from db3

依旧......

2 个答案:

答案 0 :(得分:1)

您可以使用全局临时表:

CREATE TABLE ##tmpTable(DBName VARCHAR(MAX),Content VARCHAR(MAX));
EXEC sp_MSforeachdb 'Use ? INSERT INTO ##tmpTable SELECT TOP 1 ''?'', TABLE_NAME FROM INFORMATION_SCHEMA.TABLES'
SELECT * FROM ##tmpTable;
GO
DROP TABLE ##tmpTable;

答案 1 :(得分:0)

虽然有些情况可能需要全局临时表,即“##”,但我试图偏离它们。相反,您仍然可以使用单个基于会话的临时表,即“#”或表变量,只需采用动态SQL方法来解决问题。

这是另一种选择:

  • 创建一个临时表,例如#tmp
  • 创建要运行的单个SQL可执行字符串。该字符串将包含每个数据库的查询。
  • 然后只需执行SQL字符串。

以下是代码:

create table #tmp (
    database_id int,
    database_name varchar(128),
    object_id int,
    object_name varchar(128));

declare
    @Sql varchar(max) = (
        select 'insert #tmp (database_id, database_name, object_id, object_name) select ' + convert(varchar(128), database_id) + ', ''' + name + ''', object_id, name from ' + name + '.sys.objects;'
        from sys.databases
        where name in ('master', 'msdb', 'tempdb')
        for xml path(''));

exec (@Sql);

select
    database_name,
    object_count = count(*)
from #tmp
group by
    database_name
order by
    1;

以下是上述小组的结果:

database_name         object_count
--------------------- ------------
master                116
msdb                  1194
tempdb                81
相关问题