【问题标题】:List of databases in one table, querying tables from those databases in one SQL query?一张表中的数据库列表,在一个 SQL 查询中从这些数据库中查询表?
【发布时间】:2011-01-31 00:56:10
【问题描述】:

我在 SQL 2005 服务器上有许多数据库。 有一个名为“siteadmin”的主数据库,其中有一个表“PROJECTS”,其中有一个列“DB_NAME”,其中列出了其他数据库的名称。

我需要遍历每个数据库的名称,对每个数据库中存在的名为“BUG”的表执行计数和最大查询。

这是迄今为止我想出的最好的:

USE siteadmin
DECLARE @dbname VARCHAR(50)
DECLARE @iRowCount INT
SET @iRowCount = 0
WHILE @iRowCount < (SELECT COUNT(*) FROM PROJECTS)

BEGIN
    SELECT @dbname = DB_NAME FROM PROJECTS WHERE PROJECT_ID = @iRowCount

    USE @dbname
    select
        SQ_SEQ_VALUE,
        (select count(BG_BUG_ID) from td.BUG) TotalBUGs,
        (select max(BG_BUG_ID) from td.BUG) MaxBUGID
    from td.SEQUENCES
    WHERE sq_seq_name='BUG'

    SET @iRowCount = @iRowCount + 1
    CONTINUE
END

'USE @dbname' 语句失败。

每个数据库都有相同的“BUG”表,我需要获取最大的错误 ID 和实际错误的数量。 所以我需要最终得到一个类似的列表:

        SQ_SEQ_VALUE, TotalBUGs, MaxBUGID  
dbname1 123           150        170  
dbname2 165           165        165  
dbname3 176           176        176  

我觉得我走错了方向。 有人可以帮忙吗?

【问题讨论】:

  • USE 需要一个真实的数据库名称。它不能使用变量。不幸的是,这意味着您的代码中有一些动态 SQL。

标签: sql sql-server-2005


【解决方案1】:

这似乎是一个奇怪的情况,但我认为你有充分的理由。

如果您可以信任将存储在 PROJECTS 表的 DB_NAME 列中的值,您应该可以使用 EXEC 'USE [' + @dbname + ']' 来切换活动数据库。

您必须确保用户也有权读取您需要连接的每个数据库。可能有更好的方法来完成这项任务,但对你所拥有的东西的改变很小,我希望这能奏效。

【讨论】:

  • 我必须使@RowCount = 1 并执行您在 () 中所做的操作,现在它说它找不到“BUG”表,该表肯定存在于每个数据库中。嗯...
  • 并且您将错误表作为名为@9​​87654322@ 的架构的一部分?你能提供确切的错误文本吗?
  • 抱歉,该表实际上被称为“td.BUG”。我的意思是删除td。部分来自我的示例以避免造成混淆,但我错过了它。经过数小时的反复试验(和谷歌搜索),我终于弄明白了,感谢您的帮助。
【解决方案2】:

这是我最终使用的代码:

USE siteadmin
DECLARE @sqlq VARCHAR(1500)  -- sql query
DECLARE @dbname VARCHAR(100) -- database name  

DECLARE dbnamescursor CURSOR FOR SELECT DB_NAME FROM PROJECTS;

OPEN dbnamescursor
FETCH NEXT FROM dbnamescursor INTO @dbname

WHILE @@FETCH_STATUS = 0
BEGIN   
    IF (db_id(@dbname) is not null)
    BEGIN

        SET @sqlq = 'SELECT ''' + @dbname + ''' as Databasename, Count([' + @dbname + '].[td.BUG].BG_BUG_ID) as TotalBUGs, Max([' + @dbname + '].[td.BUG].BG_BUG_ID) as MaxBUGID
        FROM [' + @dbname + '].[td.BUG] CROSS JOIN [' + @dbname + '].SEQUENCES
        WHERE ([' + @dbname + '].SEQUENCES.SQ_SEQ_NAME = ''BUG'')
        GROUP BY [' + @dbname + '].SEQUENCES.SQ_SEQ_VALUE'

        EXEC (@sqlq)
    END

    FETCH NEXT FROM dbnamescursor INTO @dbname   
END   

CLOSE dbnamescursor   
DEALLOCATE dbnamescursor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多