Sql server SQL Server:sp_MSforeachdb到单个结果集中

Sql server SQL Server:sp_MSforeachdb到单个结果集中,sql-server,Sql Server,我将归档以获取一个查询,该查询从所有数据库中提取一些数据并返回一个结果集 现在我有以下几点: DECLARE @command varchar(4000) SELECT @command = ' USE [?] SELECT database_name = DB_NAME(database_id) , log_size_mb = CAST(SUM(CASE WHEN type_desc = "LOG" THEN size END) * 8. / 1024 AS DECIMAL

我将归档以获取一个查询,该查询从所有数据库中提取一些数据并返回一个结果集

现在我有以下几点:

DECLARE @command varchar(4000)
SELECT @command = '
USE [?] 
SELECT 
    database_name = DB_NAME(database_id)
    , log_size_mb = CAST(SUM(CASE WHEN type_desc = "LOG" THEN size END) * 8. / 1024 AS DECIMAL(8,2))
    , row_size_mb = CAST(SUM(CASE WHEN type_desc = "ROWS" THEN size END) * 8. / 1024 AS DECIMAL(8,2))
    , total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2))
    , Kostenstelle = (select value from sys.extended_properties WHERE name =     "Kostenstelle")
FROM sys.master_files WITH(NOWAIT)
WHERE database_id = DB_ID()
GROUP BY database_id
'
EXEC sp_MSforeachdb @command
|database_name|log_size_mb|row_size_mb|Kostenstelle|
+-------------+-----------+-----------+------------+
|demoA        |         12|         10|        xxxx|
|demoB        |         52|         12|        xxxx|
上面的代码将返回多个结果集

结果应如下所示:

DECLARE @command varchar(4000)
SELECT @command = '
USE [?] 
SELECT 
    database_name = DB_NAME(database_id)
    , log_size_mb = CAST(SUM(CASE WHEN type_desc = "LOG" THEN size END) * 8. / 1024 AS DECIMAL(8,2))
    , row_size_mb = CAST(SUM(CASE WHEN type_desc = "ROWS" THEN size END) * 8. / 1024 AS DECIMAL(8,2))
    , total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2))
    , Kostenstelle = (select value from sys.extended_properties WHERE name =     "Kostenstelle")
FROM sys.master_files WITH(NOWAIT)
WHERE database_id = DB_ID()
GROUP BY database_id
'
EXEC sp_MSforeachdb @command
|database_name|log_size_mb|row_size_mb|Kostenstelle|
+-------------+-----------+-----------+------------+
|demoA        |         12|         10|        xxxx|
|demoB        |         52|         12|        xxxx|

如果在查询中添加
INSERT
语句,则可以在某些数据库中创建表并将结果保存在此表中:

DECLARE @command varchar(4000)
SELECT @command = '
USE [?] 
INSERT INTO <DbName>.<SchemaName>.<TableName>
SELECT 
database_name = DB_NAME(database_id)
...
DECLARE@command varchar(4000)
选择@command=
使用[?]
插入。。
挑选
数据库名称=数据库名称(数据库id)
...

收到同事的回复-1000谢谢

DECLARE @command varchar(4000)
SELECT @command = '
USE [?] 
SELECT 
database_name = CAST(DB_NAME(database_id) AS VARCHAR(50))
, log_size_mb = CAST(SUM(CASE WHEN type_desc = "LOG" THEN size END) * 8. / 1024 AS DECIMAL(8,2))
, row_size_mb = CAST(SUM(CASE WHEN type_desc = "ROWS" THEN size END) * 8. / 1024 AS DECIMAL(8,2))
, total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2))
, Kostenstelle = CAST((select value from sys.extended_properties WHERE     name =     "Kostenstelle") AS VARCHAR(10))
FROM sys.master_files WITH(NOWAIT)
WHERE database_id = DB_ID()
GROUP BY database_id
'

DECLARE @DatabasesKst TABLE
(
  database_name VARCHAR(50),
  log_size_mb DECIMAL(8,2),
  row_size_mb DECIMAL(8,2),
  total_size DECIMAL(8,2),
  Kostenstelle VARCHAR(100)
)

INSERT  INTO @DatabasesKst
EXEC sp_MSforeachdb @command

select * from @DatabasesKst

如果要过滤掉一些数据库,可以像这样用If/BEGIN/END包装“USE[?]”

DECLARE @command varchar(4000)
SELECT @command = '
IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'') 
BEGIN 
    USE [?]


    SELECT 
     (your select/from/where statement here)


 END
'

嗯,是的,那是可能的,但我希望如果可能的话不要用桌子。我还试图用declare@mytable table在内存中创建一个临时表。。。但它对我不起作用,因为“mytable在ms_foreachdb循环中不可用:-(感谢您和您的同事。这里的“诀窍”是将@variableTable的范围置于动态sql之外。玩得好!