Dynami c SQL запрос к нескольким базам данных на одном сервере в одних и тех же таблицах - PullRequest
0 голосов
/ 06 мая 2020

Ищете способ запустить приведенный ниже код в нескольких базах данных (20+ на моем сервере, все они имеют одинаковую схему таблиц). Я пробовал использовать процедуру EXEC sp_MsForEachDb, но не знаю, как это сделать с несколькими таблицами. Мой код ниже, если кто-то может помочь с запуском этого кода во всех базах данных, кроме temp и master, я был бы очень признателен за помощь.

USE PLX1

SELECT
    'X1' Company, 
    CONVERT(VARCHAR(8), DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) + 1, -1), 112) PeriodEnd, 
    SUM(balfwd + debits - credits) Balance, 
    glcodes.Gl_Code + glcodes.[DESC] AccountName
FROM
    plx1.dbo.glsmry 
INNER JOIN
    plx1.dbo.glcodes ON glsmry.GL_CODE = glcodes.GL_CODE
WHERE 
    (glcodes.[type] = 'A1')
    AND glsmry.PERIOD_ID LIKE CONVERT(VARCHAR(8),DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) +1, -1), 112)
GROUP BY
    glcodes.GL_CODE, glcodes.[desc]

1 Ответ

0 голосов
/ 06 мая 2020
-- put all @DBNames in to a table ( or query from the schema tables)

declare  @DBName varchar(max) = ''


-- Write a Cursor and assign the valuues to @DBName

Declare @dynamicSQL varchar(max) =
'select ''X1'' Company, convert(VARCHAR(8),DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) +1, -1),112) PeriodEnd, 
SUM(balfwd + debits - credits) Balance, glcodes.Gl_Code + glcodes.[DESC] AccountName
from ' +  
@DBName + '.dbo.glsmry 
inner join ' +  
@DBName + '.dbo.glcodes on glsmry.GL_CODE = glcodes.GL_CODE
where (glcodes.[type] = ''A1'')
and glsmry.PERIOD_ID like convert(VARCHAR(8),DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) +1, -1),112)
group by glcodes.GL_CODE, glcodes.[desc]'

Exec (@dynamicSQL)

Или попробуйте следующее (я не тестировал это - может потребоваться настройка, если это не так)

EXEC sp_MSForEachDb '
if ''[?]'' not in (''[master]'', ''[model]'',''[msdb]'',''[tempdb]'')
Begin
select ''X1'' Company, convert(VARCHAR(8),DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) +1, -1),112) PeriodEnd, 
    SUM(balfwd + debits - credits) Balance, glcodes.Gl_Code + glcodes.[DESC] AccountName
    from [?].dbo.glsmry 
    inner join [?].dbo.glcodes on glsmry.GL_CODE = glcodes.GL_CODE
    where (glcodes.[type] = ''A1'')
    and glsmry.PERIOD_ID like convert(VARCHAR(8),DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) +1, -1),112)
    group by glcodes.GL_CODE, glcodes.[desc]
End
'
...