我正在尝试编写一个存储过程,它允许我编写一个在我的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 ...的结果? (换句话说,一个结果表)?
我想过在程序中创建一个临时表,你怎么看?
提前致谢!
答案 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