【问题标题】:query multiple databases for statistic purposes SQL查询多个数据库以进行统计 SQL
【发布时间】:2011-03-17 21:23:48
【问题描述】:

我正在尝试编写一个存储过程,它允许我编写一个在我的 SQL Server 上的所有数据库上运行的单个 SELECT 语句。 (微软 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 .. 的结果? (换句话说,一个结果表)?

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

提前致谢!

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 pranay,你有任何代码示例或参考资料来说明如何做到这一点吗?我对 SQL 不太擅长):
    【解决方案2】:

    可能是动态 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
    

    【讨论】:

    • 有比 nvarchar(max) 更大的东西吗? /:这对我不起作用
    • 它没有足够的字符。查询被“切断”
    • 我怀疑这会是问题所在。我认为它需要大约 2GB 的字符串。你得到了什么错误?事后思考:实际上我只是认为打印输出时打印输出可能会被截断。我添加了一个新行,将显示所有文本。
    • 哦,我很抱歉!谢谢你是绝对正确的。一定是我在 SQL Server Management Studio Express 中的结果窗口截断了它。
    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 2016-11-28
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多