我们尝试使用链接服务器将一些数据从SQL Server发布到Oracle。数据有时会正确插入,但有时会失败。不知道为什么会失败。
我在 SQL Server 存储过程中保留了一个 TRY catch 块,但没有捕获。你能帮我这个吗?
在这方面浏览了几个网站,但不知何故,它不起作用
我的代码:
INSERT INTO OPENQUERY (SomeDB, 'SELECT a, s, d, f, e FROM XYZ')
SELECT
a, s, d, f, @e
FROM
@tbltest
不幸的是,如果您使用诸如插入到OPENQUERY(....(或从OPENQUERY(...(中选择之类的命令,则开始尝试/结束尝试块不会捕获与链接服务器相关的错误
但是您可以尝试将SQL请求转换为字符串并使用EXEC sp_executesql"插入到OPENQUERY(....("。或者执行sp_executesql"从OPENQUERY中选择"在开始尝试/结束尝试块中。 例如:
-- Script start
BEGIN TRY
EXEC sp_executesql
'INSERT INTO OPENQUERY (SomeDB, ''SELECT a, s, d, f, e FROM XYZ'')
SELECT a, s, d, f, @e
FROM @tbltest'
END TRY
BEGIN CATCH
-- Handle error here, for example
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH
-- End
如果它不适用于表变量 (@tbltest(,请尝试使用临时表,它们通常也更快。
此外,您可能会发现在开始所有这些内容之前测试链接服务器的可用性很有用:
EXEC sp_testlinkedserver N'SomeDB';
你可能想要这样的结构
BEGIN TRY
INSERT INTO [database]..[Table]([Column1], [Column2], [Column3])
SELECT
[Column1], [Column2], [Column3]
FROM
[database]..[SourceTable]
END TRY
BEGIN CATCH
INSERT INTO [database]..[ErrorTable]([Column1], [Column2], [Column3])
SELECT
[Column1], [Column2], [Column3]
FROM [database]..[SourceTable]
END CATCH
你可以尝试这样的事情
BEGIN TRY
INSERT INTO [database]..[Table]([Column1], [Column2], [Column3])
SELECT
a, s, d, f, e
FROM
LINE_INTG.STG_PRDCTN_RUN_SHIFT_DTL
END TRY
BEGIN CATCH
INSERT INTO [database]..[ErrorTable]([Column1], [Column2], [Column3])
SELECT
a, s, d, f, e
FROM LINE_INTG.STG_PRDCTN_RUN_SHIFT_DTL
END CATCH