Я хочу запустить этот код для каждой базы данных

 exec sp_MSForEachDB @command1 = 'SELECT DB_NAME() AS [CurrentDatabase], CompanyName, CASE WHEN IsCommited = 1 THEN ''Yes'' WHEN IsCommited = 0 THEN ''No'' END as CaseIsInCommit FROM  ?.dbo.CompanyCase;'

Данные для примера будут такими: [(db1, Company1, 1), (db2, Company2, 1), (db3, Company3, 1)] Предполагается, что этот код получает имя базы данных, название компании из таблицы и укажите, было ли оно совершено или нет, но проблема, с которой я столкнулся, заключается в том, что он будет отображать такие результаты, как

Данные для примера будут [(db1, Company1, 1), (db2, Company2, 1), (db3, Company3, 1)]

 CurrentDatabase     CampanyName     IsCommited
       db1             Company1         Yes
       db1             Company2         Yes
       db1             Company3         Yes

Что происходит: он продолжает говорить db1 вместо db2 или db3 для других компаний. Как я могу заставить его сказать db2 и db3 для правильной компании? Это должно выглядеть так

 CurrentDatabase     CampanyName     IsCommited
       db1             Company1         Yes
       db2             Company2         Yes
       db3             Company3         Yes

Я думал, что DB_NAME() выполнит эту работу, но похоже, что он застрял в той же базе данных, в то время как другие столбцы перемещаются в следующий.

0
DaBeau96 23 Окт 2018 в 17:59

2 ответа

Лучший ответ

Я думаю, вам нужно перейти на базу данных. Попробуй это:

exec sp_MSForEachDB @command1 = 'USE [?]; SELECT DB_NAME() AS [CurrentDatabase], CompanyName, CASE WHEN IsCommited = 1 THEN ''Yes'' WHEN IsCommited = 0 THEN ''No'' END as CaseIsInCommit FROM  ?.dbo.CompanyCase;'

И здесь является простым примером.

3
Gordon Linoff 23 Окт 2018 в 15:03

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

    DECLARE @DBNames TABLE
    (
        ID INT IDENTITY(1,1)
        ,DBNAME nVARCHAR(200)

    )

INSERT INTO @DBNames
select distinct
 db_name(s_mf.database_id) dbName 
    from
        sys.master_files s_mf
    where
        s_mf.state = 0 and -- ONLINE
        has_dbaccess(db_name(s_mf.database_id)) = 1 -- Only look at databases to which we have access
    and db_name(s_mf.database_id) not in ('master','tempdb','model','msdb','distribution')
    and db_name(s_mf.database_id) not like 'MSDB%'
    and db_name(s_mf.database_id) not like 'Report%'
    and type=1
    order by 
        db_name(s_mf.database_id)

        DECLARE @Count INT, @Counter INT,   @CurrentName NVARCHAR(260)
    SELECT @Count = COUNT(*) FROM @DBNames m
    SET @Counter = 1

DECLARE @SQL1 as nVARCHAR (MAX)

    WHILE @Counter <= @Count
    BEGIN
        SELECT @CurrentName = DBNAME FROM @Modules m WHERE ID = @Counter
         set @SQL1 ='USE ' + @CurrentName  +';' +  'SELECT '+@CurrentName+' [CurrentDatabase], CompanyName, CASE WHEN IsCommited = 1 THEN ''Yes'' WHEN IsCommited = 0 THEN ''No'' END as CaseIsInCommit FROM  ?.dbo.CompanyCase;'
         exec @SQL1

        SET @Counter = @Counter + 1
    END 
0
China Syndrome 23 Окт 2018 в 15:14
52952178