Microsoft SQL:多个数据库的抽象脚本

时间:2011-04-27 15:18:46

标签: sql-server-2005 tsql sql-server-2008

我需要将图像目录记录从一个服务器复制到另一个服务器,其数据库名称以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 个答案:

答案 0 :(得分:1)

Zim博士,

据我所知,这不能在数据库级别完成。

当然,有一些工具可以帮助您实现这一功能,例如Redgate Compare,或者内置到各种版本的Visual Studio中。

如果您需要一种在定期运行的脚本中自动执行此操作的方法,您可以将SYNONYMS用于表,但是肯定需要一些前期工作,并且它在许多情况下绝对没用。见:http://msdn.microsoft.com/en-us/library/ms177544.aspx

我希望这会有所帮助。

答案 1 :(得分:1)

不使用exec(@variable),而是使用exec sp_ExecuteSQL。它创建了一个执行计划,而不是每个执行的新计划。请参阅MSDN's Using sp_ExecuteSQL文章。然后,您可以使用动态SQL更改dbname或使用循环来遍历一组数据库。在半伪代码中:

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''