2010-07-19 21 views
1

我正在嘗試編寫一個存儲過程,該存儲過程將允許我編寫在SQL Server上的所有數據庫上運行的單個SELECT語句。 (微軟SQL 2005)爲統計目的查詢多個數據庫SQL

到目前爲止,香港專業教育學院想出了下面的過程

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [sp_cross_db_query] 
@SQLQuery varchar(400) 
AS 

DECLARE @DB_Name varchar(100) 
DECLARE database_cursor CURSOR FOR 

SELECT DatabaseName 
FROM Management.dbo.Customers 

OPEN database_cursor 

FETCH NEXT FROM database_cursor INTO @DB_Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    exec(
     'USE [' + @DB_Name + '];' + 
     @SQLQuery 
     ) 
     FETCH NEXT FROM database_cursor INTO @DB_Name 
END 
CLOSE database_cursor 
DEALLOCATE database_cursor 

通過它來運行查詢

exec sp_cross_db_query 'SELECT count(*) FROM Products' 

我可以指望在所有數據庫中的所有產品,問題是我返回數據的方式。現在我得到了幾個「窗戶」,結果巫婆是非常難以控制的。 所以我的問題是,我怎麼能得到非常像一個選擇結果..,聯盟選擇..,聯盟選擇..? (換句話說,一個結果表)?

我想過在程序內部創建臨時表,您怎麼看?

在此先感謝!

回答

1

可能動態SQL

DECLARE @DynSQL nvarchar(max) 

select 
@DynSQL = isnull(@DynSQL + ' UNION ALL ','') + 
'SELECT count(*) AS ProdCnt FROM ' + quotename(name) + '..Products' 
from sys.databases 
WHERE state= 0 AND is_in_standby=0 AND database_id>4 /*Exclude Offline and System 
                 databases*/ 

PRINT @DynSQL /*For Debugging or use the next line if the print output is truncated*/ 
SELECT @DynSQL AS [processing-instruction(x)] FOR XML PATH('') 

EXEC sp_executesql @DynSQL 
+0

謝謝,我會試試這個。 – Alexander 2010-07-19 12:34:18

+0

有什麼更大的nvarchar(最大)? /: 這對我不起作用 – Alexander 2010-07-19 13:03:27

+0

它沒有足夠的字符。該查詢得到'切斷' – Alexander 2010-07-19 13:12:29

2

我想除了臨時表之外沒有別的辦法來實現你想要的功能。您需要在臨時表中添加行,而不必使用select @tablevariable來獲取所有數據。

檢查:http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-2

+0

感謝pranay,做u對如何做到這一點的任何代碼示例或引用?即時通訊不是那麼偉大的SQL): – Alexander 2010-07-19 12:26:04

+0

檢查鏈接爲那 – 2010-07-19 12:40:12