查询多个数据库以进行统计SQL
我正在尝试编写一个存储过程,该过程允许我编写一条SELECT语句,该语句在SQL Server上的所有数据库上运行。(Microsoft SQL 2005) 到目前为止,我想出了以下步骤查询多个数据库以进行统计SQL,sql,sql-server-2005,Sql,Sql Server 2005,我正在尝试编写一个存储过程,该过程允许我编写一条SELECT语句,该语句在SQL Server上的所有数据库上运行。(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 databas
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@tablevariable来获取所有数据 检查此项:可能是动态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
谢谢pranay,你有关于如何做到这一点的代码示例或参考资料吗?我不太擅长SQL):有比nvarchar(max)更大的吗?/:这对我不起作用,因为我没有足够的字符。问题被“切断”,我怀疑这将是问题所在。我想它需要高达2GB的字符串。你犯了什么错误?事后思考:事实上,我只是认为打印输出可能会在打印时被截断。我添加了一行新内容,将显示所有文本。哦,我真的很抱歉!谢谢,你完全正确。一定是SQL Server Management Studio Express中的“我的结果”窗口截断了它。