2015-05-30 16 views
6

Tôi sẽ lưu trữ để nhận truy vấn lấy dữ liệu từ tất cả các cơ sở dữ liệu và trả về một tập kết quả.SQL Server: sp_MSforeachdb thành tập hợp kết quả đơn

Ngay bây giờ tôi có như sau:

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 

Đoạn mã trên sẽ trở lại trong nhiều bộ kết quả.

Kết quả sẽ trông giống như sau:

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

Trả lời

2

Bạn có thể tạo bảng trong một số db và lưu kết quả trong bảng này nếu bạn thêm INSERT tuyên bố trong truy vấn của bạn:

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

tốt, có điều đó sẽ có thể nhưng mong muốn của tôi là không t sử dụng một bảng nếu có thể. Tôi cũng đã cố gắng để tạo ra một bảng tạm thời trong bộ nhớ với khai báo @ mytable bảng ... nhưng nó đã không làm việc cho tôi vì "mytable không có sẵn bên trong vòng lặp ms_foreachdb :-( – Alex

4

Got a trả lời từ một đồng nghiệp - 1000 cảm ơn

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 
Các vấn đề liên quan