2011-01-31 122 views
1

我在SQL 2005服務器上有很多數據庫。 有一個名爲'siteadmin'的主數據庫,它有一個'PROJECTS'表,其中有一個列'DB_NAME'列出了其他數據庫的名稱。一個表中的數據庫列表,在一個SQL查詢中從這些數據庫查詢表?

我需要遍歷每個數據庫的名稱,對每個數據庫中存在的名爲'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 

它未能在「使用@dbname」語句。

每個數據庫都有相同的'BUG'表,我需要獲取最大錯誤ID和實際錯誤數量。 所以我需要一個像列表來結束:

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

我有一種感覺,我曾經在一個完全錯誤的方向走了。 有人能幫忙嗎?

+0

`USE`需要一個真正的數據庫名。它不能使用變量。不幸的是,這意味着你的代碼中有一些動態的SQL。 – 2011-01-31 04:34:09

回答

0

這看起來很奇怪,但我認爲你有很好的理由。

如果您可以信任將存儲在PROJECTS表的DB_NAME列中的值,則應該可以使用EXEC 'USE [' + @dbname + ']'替代切換活動數據庫。

您必須確保用戶有權從每個您需要連接的數據庫中讀取數據。可能有更好的方法來完成這個任務,但是對於你所擁有的我所期望的工作只需要很少的改變。

+0

我不得不使@RowCount = 1,並做你在()中所做的事情,現在它說它找不到'BUG'表,它肯定存在於每個數據庫中。嗯... – 2011-01-31 01:36:30

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