Microsoft SQL: абстрактный скрипт для нескольких баз данных - PullRequest
1 голос
/ 27 апреля 2011

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

delete
from      p_PhotoDB.dbo.item_keyword
where     not exists (
    select  null as nothing
    from    OtherServer.p_PhotoDB.dbo.item_keyword new
    where   p_PhotoDB.dbo.item_keyword.item_id = new.item_id and
            p_PhotoDB.dbo.item_keyword.keyword_id = new.keyword_id
)

Я знаю, яможет поместить всю вещь в строковую переменную и exec (@variable), но это будет компилироваться каждый раз для каждого оператора для каждого каталога ...

Есть ли способ изменить ссылку p_PhotoDB для каждой найденной базы данныхначиная с p_ без использования какой-либо формы exec (@variable)?

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Вместо использования exec(@variable) используйте exec sp_ExecuteSQL.Он создает один план выполнения, а не новый для каждого выполнения.См. Статью MSDN Использование sp_ExecuteSQL .Затем вы можете использовать динамический SQL для изменения имени базы данных или использовать цикл для циклического прохождения набора баз данных.В полупсевдокоде:

Set @DbList='p_db1,p_db2,p_db3,...'

--- Loop through comma separated list and build dynamic sql
-- while
set @SQL='delete
from      '+@CurrentDBName+'.dbo.item_keyword
where     not exists (
    select  null as nothing
    from    OtherServer.p_PhotoDB.dbo.item_keyword new
    where   '+@CurrentDBName+'.dbo.item_keyword.item_id = new.item_id and
            '+@CurrentDBName+'.dbo.item_keyword.keyword_id = new.keyword_id
)'

-- end while
exec sp_ExecuteSQL @SQL,N''
1 голос
/ 13 мая 2011

Доктор Зим.,

Насколько мне известно, это невозможно сделать на уровне базы данных.

Конечно, существуют инструменты, которые могут помочь вам сделать это.такие как Redgate Compare или встроенные в различные версии Visual Studio.

Если вам нужен способ автоматизировать это в периодически запускаемом скрипте, вы можете использовать SYNONYMS для таблиц, но определенно естьпередняя работа там требуется, и она определенно бесполезна в ряде ситуаций.СМОТРИТЕ: http://msdn.microsoft.com/en-us/library/ms177544.aspx

Надеюсь, это поможет.

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