2015-05-30 7 views
6

Я собираюсь архивировать, чтобы получить запрос, который извлекает некоторые данные из всех баз данных и возвращает один набор результатов.SQL Server: sp_MSforeachdb в единый результирующий набор

Прямо сейчас у меня есть следующий:

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| 

ответ

2

Вы можете создать таблицу в некоторых БД и сохранить результаты в этой таблице, если добавить INSERT заявление в запросе:

DECLARE @command varchar(4000) 
SELECT @command = ' 
USE [?] 
INSERT INTO <DbName>.<SchemaName>.<TableName> 
SELECT 
database_name = DB_NAME(database_id) 
... 
+0

ну да, это будет возможно, t используйте таблицу, если это возможно. Я также попытался создать временную таблицу в памяти с объявлением таблицы @mytable ... но она не работала для меня, потому что «mytable не доступен внутри цикла ms_foreachdb :-( – Alex

4

Получил ответ от коллеги - 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 
Смежные вопросы