Список баз данных в одной таблице, запрашивая таблицы из этих баз данных в одном запросе SQL? - PullRequest
1 голос
/ 31 января 2011

У меня много баз данных на сервере SQL 2005.Существует основная база данных под названием «siteadmin», в которой есть таблица «PROJECTS», в которой есть столбец «DB_NAME», в котором перечислены имена других баз данных.

Мне нужно перебирать каждое из этих имен баз данных, выполняязапрос count и max для таблицы с именем '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», и мне нужно получить максимальный идентификатор ошибки и количество фактических ошибок.Поэтому мне нужно закончить со списком вроде:

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

У меня такое ощущение, что я пошел в совершенно неверном направлении.Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 31 января 2011

Это код, который я использовал в итоге:

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
0 голосов
/ 31 января 2011

Это кажется странным сценарием, но я полагаю, у вас есть на то веские причины.

Если вы можете доверять значениям, которые будут сохранены в столбце DB_NAME таблицы PROJECTS, вы сможете переключать активную базу данных, используя вместо этого EXEC 'USE [' + @dbname + ']'.

Вы должны будете убедиться, что у пользователя есть права на чтение из каждой базы данных, к которой вам также нужно подключиться.Возможно, есть более эффективные методы для решения этой задачи, но с минимальным изменением того, что у вас есть, я ожидаю, что это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...