0

问题

我正在将 JayDeBeApi 连接到 SQL Server 2017 并运行如下脚本:

  1. SELECT ... INTO #a-temp-table
  2. 从表中删除
  3. INSERT INTO a-table SELECT FROM #a-temp-table
  4. 删除#a-temp-table

在第 3 步中,我收到以下错误:

无法在具有唯一索引“UQ_a-table”的对象“dbo.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)成功完成,所以不会抛出异常。xNone并且在检查时localCursor,我没有看到任何错误消息/代码的迹象

4

2 回答 2

1

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-2017

-- 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;   
于 2018-05-09T09:52:02.893 回答
1

第 3 步应该是全有或全无,因此除非您的实际代码有WHERE子句,否则在重复键错误之后 a-table 应该是空的。

关于未检测到的异常,添加SET NOCOUNT ON为脚本中的第一条语句。这将抑制会干扰脚本执行的 DONE_IN_PROC 消息,除非您的代码处理多个结果集。

于 2018-05-09T12:15:20.583 回答