2015-03-16 4 views
0

Недавно начал изучать SQL и столкнулся с этой проблемой, что я не могу найти решение. Я пытаюсь собрать данные из нескольких баз данных и выводить их в одну таблицу. ДанныеTSQL Сбор данных из нескольких баз данных

Источник выберите выходы в две колонки и «имя источника дб» «acAcct»

Целевая таблица имеет «acAcct» и столбец для каждой БД.

Вещь, что я придумал:

DECLARE @command varchar(1000) 
SET @command = 'IF ''[?]'' NOT IN (''[master]'', ''[model]'', ''[msdb]'', ''[tempdb]'') 

INSERT INTO _utility.dbo.konta (acAcct, ''?'') 
SELECT DISTINCT AC.acAcct 
       ,AD.acName AS ''?''     
         from tHE_AcctTransItem as AC 
         LEFT JOIN vDE_SetAccount as AD 
         ON AC.acAcct = AD.acAcct' 

EXEC sp_MSforeachdb @command 

Я получаю эту ошибку для каждой БД:

Msg 102, Level 15, State 1, Line 3 
Incorrect syntax near 'name of DB'. 

Я думаю, что я что-то с разбором переменной на отсутствующий:

INSERT INTO _utility.dbo.konta (acAcct, ''?'') 

Выбор работает нормально.

EDIT:

Законченное с этим:

DECLARE @command varchar(1000) 
SET @command = 'IF ''[?]'' NOT IN (''[master]'', ''[model]'', ''[msdb]'', ''[tempdb]'') 

MERGE _utility.dbo.konta AS target 
USING (SELECT DISTINCT AC.acAcct 
       ,AD.acName AS [?]     
         from [?].dbo.tHE_AcctTransItem as AC 
         LEFT JOIN [?].dbo.vDE_SetAccount as AD 
         ON AC.acAcct = AD.acAcct) as source 
    ON (target.acAcct = source.acAcct) 
     WHEN MATCHED THEN UPDATE SET target.[?] = source.[?] 
     WHEN NOT MATCHED THEN 
      INSERT (acAcct, [?]) 
      VALUES (source.acAcct, [?]); 
      ' 
EXEC sp_MSforeachdb @command 

Оригинальный сценарий заполняется только первый столбец и ошибочный на других.

+0

Какое имя столбца вы пытаетесь вставить в '_utility.dbo.konta'? Различие для каждой БД? У вас действительно достаточно баз данных, а новые добавляются достаточно часто, чтобы потребовать использовать Dynamic SQL для этого процесса? – GarethD

+0

лучший предмет - это сломан. Делает ли выбор самостоятельно? Является ли ИФ на своей собственной работе? –

+0

В «_utility.dbo.konta» имеется около 30 баз данных, а имена баз данных соответствуют именам столбцов. – Marko

ответ

0

Если исходное имя базы данных является столбцом, то оно не должно быть заключено в одинарные кавычки. Квадратные скобки будут более безопасными.

DECLARE @command varchar(1000) 
SET @command = 'IF ''[?]'' NOT IN (''[master]'', ''[model]'', ''[msdb]'', ''[tempdb]'') 

INSERT INTO _utility.dbo.konta (acAcct, [?]) 
SELECT DISTINCT AC.acAcct 
     ,AD.acName AS [?]     
      from tHE_AcctTransItem as AC 
      LEFT JOIN vDE_SetAccount as AD 
      ON AC.acAcct = AD.acAcct' 

EXEC sp_MSforeachdb @command 
Смежные вопросы