查询多个数据库以用于统计目的SQL

时间:2010-07-19 12:11:36

标签: sql sql-server-2005

我正在尝试编写一个存储过程,它允许我编写一个在我的SQL Server上的所有数据库上运行的SELECT语句。 (Microsoft SQL 2005)

到目前为止,我已经提出了以下程序

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'
通过这个,我可以计算所有数据库上的所有产品,问题是我返回数据的方式。现在我得到几个“窗户”,其结果是女巫是非常难以管理的。 所以我的问题是,我怎么能得到一个非常像SELECT ..,UNION SELECT ..,UNION SELECT ...的结果? (换句话说,一个结果表)?

我想过在程序中创建一个临时表,你怎么看?

提前致谢!

2 个答案:

答案 0 :(得分:2)

我认为除了临时表之外没有其他方法可以实现您想要的功能。您需要在临时表中添加行,而不是必须使用select @tablevariable来获取所有数据。

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

答案 1 :(得分: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