使用链接服务器连接时使用IF ELSE的SQL Server脚本出错

布莱恩·伊尼亚

使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 JDBC SQL 服务器连接查询时出错

在SQL Server中使用MERGE时出错(带有openquery和链接服务器)

如何使用链接服务器创建从 Access 到 SQL Server 的 ODBC 连接?

使用SQL脚本导出链接的服务器属性

使用dbWriteTable将数据从Linux服务器写入SQL Server时出错

从SQL Server链接服务器连接到Sphinx

连接到SQL Server时出错。服务器未找到或无法访问

连接到 MS SQL 服务器时出错

调用连接到 SQL 服务器的函数时出错

使用IDE连接到Openshift服务器时出错

当我使用SQL Server Management Studio 17时,“连接到服务器对话框”出现错误,错误为“无法连接到本地”

建立与SQL Server的连接时发生与网络相关或特定于实例的错误。查找指定的服务器/实例时出错)

SQL Server 2012-使用openquery插入链接服务器表

当链接服务器使用SQL Server时,串联不起作用

如何使用WAMP服务器将SQL Server与php Web应用程序连接?

SQL Server 20XX-使用链接服务器查询编译存储过程时,“客户端不支持加密”

SQL Server脚本服务器错误

SQL Server:链接服务器查询

SQL Server链接服务器联接

SQL Server版本-链接服务器

SQL Server 链接服务器配置

有什么方法可以使用链接服务器将SQL Server 2016与MySql服务器集成在一起?

设置服务器输出时出错,PL/SQL 脚本无法在 FME 中执行?

服务器 '' 上的 MSDTC 不可用。调用存储过程时sql server链接服务器错误

我们是否必须在SQL Server托管实例连接字符串中使用故障转移组服务器名称或主服务器名称

从 SQL Express 实例创建到 SQL Azure 数据库的链接服务器时出错“此版本的 SQL Server 不支持 Windows 登录。”

在 Linux 中使用 RODBC 连接到 SQL Server 时出错

使用PHP连接到MS SQL Server时出错

从Azure逻辑应用连接到Azure SQL服务器时出错