Я хочу запустить этот код для каждой базы данных
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()
выполнит эту работу, но похоже, что он застрял в той же базе данных, в то время как другие столбцы перемещаются в следующий.
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;'
И здесь является простым примером.
Проблема в том, что вы не меняете базу данных для выполнения. Вот способ сделать это с помощью некоторого динамического 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
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.