误吞了

时间:2018-05-09 09:47:30

标签: python sql-server jaydebeapi

问题

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

  1. SELECT ... INTO#a-temp-table
  2. 从a-table
  3. 删除
  4. 从#a-temp-table
  5. INSERT INTO-table SELECT FROM
  6. 删除#a-temp-table
  7. 在第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)成功完成,因此不会抛出任何异常。 xNone,在检查localCursor时,我看不到任何错误消息/代码的迹象

2 个答案:

答案 0 :(得分: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;   

答案 1 :(得分:1)

步骤3应为a​​ll-or-none,因此除非您的实际代码具有WHERE子句,否则a-table应该在重复键错误后为空。

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