2015-05-30 15 views
6

Mam zamiar zarchiwizować, aby uzyskać zapytanie, które pobiera niektóre dane ze wszystkich baz danych i zwraca pojedynczy zestaw wyników.Serwer SQL: sp_MSforeachdb w jeden zestaw wyników

Teraz mam następujące:

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 

Powyższy kod powróci w wielu zestawów wynikowych.

Wynik powinien wyglądać następująco:

|database_name|log_size_mb|row_size_mb|Kostenstelle| 
+-------------+-----------+-----------+------------+ 
|demoA  |   12|   10|  xxxx| 
|demoB  |   52|   12|  xxxx| 

Odpowiedz

2

Można utworzyć tabelę w pewnym db i zapisać wyniki w tabeli, jeśli dodać INSERT oświadczenie w zapytaniu:

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

Cóż, tak, to będzie możliwe, ale moje życzenie t jeśli to możliwe, korzystaj z tabeli. Próbowałem również utworzyć tabelę tymczasową w pamięci przy użyciu tabeli declare @mytable ... ale to nie działało, ponieważ "mytable nie jest dostępne w pętli ms_foreachdb :-( – Alex

4

Got odpowiedź od kolegi - 1000 dzięki

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 
Powiązane problemy