使用SQL中的数据迁移脚本,其中我们必须处理具有多个表的多个数据库。想要创建一个通用脚本,其中包含我们需要迁移的所有表。问题是,并非所有数据库都将包含每个表。所以我走了检查表是否存在的路线,如果存在,则进行数据复制。
在必须从LINK服务器提取数据之前,它一直工作良好。似乎在必须考虑LINK服务器的情况下,它将忽略ALL。
IF (exists (select * from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'local_ArCreateLinesLog')
and exists(select * from [SQVM\KUS1].[CAPE].INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' and TABLE_NAME = 'local_ArCreateLinesLog'))
BEGIN
declare @cnt as int, @cnt1 as int
select @cnt=count(*) from Local_ArCreateLinesLog where local_ArCreateLinesLogSqlID = (select sqlserver from sqlservers where hostname = 'SQVM\KUS1' and databasename = 'CAPE')
--print 'KUS5 Local_ArCreateLinesLog Record Count: ' + cast(@cnt as varchar(5))
select @cnt1=count(*) from [SQVM\KUS1].[CAPE].[dbo].[Local_ArCreateLinesLog] where local_ArCreateLinesLogSqlID = (select sqlserver from sqlservers where hostname = 'SQVM\KUS1' and databasename = 'CAPE')
--print 'KUS1 Local_ArCreateLinesLog Record Count: ' + cast(@cnt1 as varchar(5))
--if @cnt <> @cnt1
--BEGIN
print '!!!!COUNTS DONOT MATCH!!!!'
--END
END
ELSE
BEGIN
print 'Table Local_ArCreateLinesLog Does Not Exist in this Partner'
END
如果我注释掉包含与LINK服务器的连接的行,则该行运行良好并且遵守IF约束。如果LINK服务器在其中,则会收到错误消息,指出:
Msg 7314, Level 16, State 1, Line 39
The OLE DB provider "SQLNCLI10" for linked server "SQVM\KUS1" does not contain the table ""CAPE"."dbo"."Local_ArCreateLinesLog""
的确如此,链接服务器中不存在该表,这就是为什么在过程开始时使用if语句的原因。
所以我的问题是,在处理LINK服务器时,是否缺少使该SQL脚本服从IF条件的内容。
两台SQL Server均为2008R2,并已修补到同一级别。
试试这个...
改变这个
IF (
EXISTS ( SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'local_ArCreateLinesLog' )
AND EXISTS ( SELECT * FROM [SQVM\KUS1].[CAPE].INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'local_ArCreateLinesLog' )
)
BEGIN ...
对此
IF (
EXISTS ( SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'local_ArCreateLinesLog' )
)
BEGIN ...
然后改变这个
SELECT @cnt = COUNT( * ) FROM Local_ArCreateLinesLog WHERE local_ArCreateLinesLogSqlID = ( SELECT sqlserver FROM sqlservers WHERE hostname = 'SQVM\KUS1' AND databasename = 'CAPE' );
对此
BEGIN TRY
EXEC sp_executesql N'SELECT @cnt = COUNT( * ) FROM Local_ArCreateLinesLog WHERE local_ArCreateLinesLogSqlID = ( SELECT sqlserver FROM sqlservers WHERE hostname = ''SQVM\KUS1'' AND databasename = ''CAPE'' )', N'@cnt INT OUTPUT', @cnt=@cnt OUTPUT;
END TRY
BEGIN CATCH
SET @cnt = 0;
END CATCH
使用链接服务器可能非常古怪。您的IF / EXISTS失败的原因是SQL Server在执行之前先编译了元数据,就像您的情况一样,当表不存在时元数据就会失败。您也不能在TRY / CATCH块中捕获编译错误,因此调用sp_executesql不会首先进行编译,并且具有捕获和处理的额外好处。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句