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