【问题标题】:catching error in loop sql query在循环 sql 查询中捕获错误
【发布时间】:2019-01-23 14:48:22
【问题描述】:

我有下面的插入查询,它从 OriginalData 表中选择记录,其中所有内容都是 nvarchar(max),并将其插入到具有特定字段定义的 Temp 表中,即 MainAccount 是 INT。

我正在逐行插入,因为如果 OriginalData 表中有一条 MainAccount 值为“Test”的记录,则显然会导致转换错误并且插入将失败。

我希望能够捕获此错误。 originalData 表上有一个我想填充的名为“error”的字段。但是我希望它在整个表中运行,而不是在第一个错误时失败并停止。

DECLARE @RowId INT
, @MaxRowId INT  

Set @RowId = 1
Select @MaxRowId = 60 

WHILE(@RowId <= @MaxRowId)
BEGIN
INSERT INTO [Temp] (ExtractSource, MainAccount,RecordLevel1Code, RecordLevel2Code, RecordTypeNo, TransDate, Amount, PeriodCode, CompanyCode)

SELECT ExtractSource, MainAccount,RecordLevel1Code, RecordLevel2Code,RecordTypeNo,TransDate, Amount, PeriodCode, DataAreaId
FROM [OriginalData] 
WHERE RowId = @RowId

PRINT @RowId  
SET @RowId  = @RowId  + 1        
END
select * from [Temp]

【问题讨论】:

  • ... where RowId = @RowId and MainAccount != 'Test' 会从可预测的来源减少错误吗?您的catch 块中将进行多少分析以确定异常的实际原因?

标签: sql tsql while-loop


【解决方案1】:

你应该使用TRY..CATCH 块:

WHILE(@RowId <= @MaxRowId)
BEGIN
  BEGIN TRY  
    INSERT INTO [Temp] (ExtractSource, MainAccount,RecordLevel1Code,
      RecordLevel2Code, RecordTypeNo, TransDate, Amount, PeriodCode, CompanyCode)
    SELECT ExtractSource, MainAccount,RecordLevel1Code, RecordLevel2Code,
       RecordTypeNo,TransDate, Amount, PeriodCode, DataAreaId
    FROM [OriginalData] 
    WHERE RowId = @RowId;

    PRINT @RowId;

  END TRY  
  BEGIN CATCH  
    -- error handlingg
  END CATCH 
  SET @RowId += 1;      
END

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多