我正在与JayDeBeApi连接到SQL Server 2017并运行如下脚本:
在第3步中,我收到以下错误:
无法在对象'dbo.a-table'中插入具有唯一索引'UQ_a-table'的重复键行。重复键值为(11,0001,3751191,T70206CAT,0000)。
而不是~360k记录,只插入~180k。所以第3步中止。 然而,临时表被删除。所以第4步就完成了。
我能够修复错误。但是对于JayDeBeApi,我没有看到错误。 从Python的角度来看,似乎一切都很顺利。
我的目标是捕获这些错误以适当地处理它们。 知道如何实现这个目标吗?
我的Python代码看起来像。
try:
localCursor = dbConnection.cursor()
x = localCursor.execute(query)
logInfo("Run script %s... done" % (scriptNameAndPath), "run script", diagnosticLog)
except Exception as e:
logError("Error running sql statement " + scriptNameAndPath + ". Skipping rest of row.",
"run script", e, diagnosticLog)
myrow = skipRowAndLogRecord(startRowTime, cursor, recordLog)
continue
x = localCursor.execute(myqrystm)
成功完成,因此不会抛出任何异常。 x
为None
,在检查localCursor
时,我看不到任何错误消息/代码的迹象
答案 0 :(得分:1)
-- Create procedure to retrieve error information.
CREATE PROCEDURE usp_GetErrorInfo
AS
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
GO
BEGIN TRY
-- Generate divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
-- Execute error retrieval routine.
EXECUTE usp_GetErrorInfo;
END CATCH;
答案 1 :(得分:1)
步骤3应为all-or-none,因此除非您的实际代码具有WHERE
子句,否则a-table应该在重复键错误后为空。
关于未检测到的异常,添加SET NOCOUNT ON
作为脚本中的第一个语句。这将抑制DONE_IN_PROC消息,这些消息将干扰脚本执行,除非您的代码处理多个结果集。