一个表中的数据库列表,在一个SQL查询中查询这些数据库中的表?

时间:2011-01-31 00:56:11

标签: sql sql-server-2005

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

我需要遍历在每个数据库中存在的名为“BUG”的表上执行count和max查询的每个数据库名称。

这是我迄今为止所提出的最好的结果:

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  

我有一种感觉,我走错了方向。 有人能帮忙吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

这是我最终使用的代码:

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