在循环SQL查询中捕获多个错误

时间:2018-08-16 18:45:05

标签: sql sql-server tsql while-loop

我有以下插入查询,该查询从OriginalData表中选择记录,其中所有记录均为数据类型nvarchar(max),并将其插入到具有特定列定义的临时表中,即MainAccount属于输入INT

我正在逐行插入,因为如果OriginalData表中有一条记录,其中MainAccount的值是'Test',显然会导致转换错误,并且插入将失败。 begin try块用于更新错误表。

但是,如果同一行上有多个错误,我希望能够捕获它们,而不仅仅是第一个。

TRUNCATE TABLE [Temp] 

DECLARE @RowId INT, @MaxRowId INT  

SET @RowId = 1

SELECT @MaxRowId = MAX(RowId) 
FROM [Staging].[FactFinancialsCoded_Abbas_InitialValidationTest]

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 
            [Staging].[FactFinancialsCoded_Abbas_InitialValidationTest]  
        WHERE 
            RowId = @RowId;

    PRINT @RowId;

END TRY  
BEGIN CATCH  

Update [Staging].[FactFinancialsCoded_Abbas_InitialValidationTest]  
Set ValidationErrors = ERROR_MESSAGE()
where RowId = @RowId  

END CATCH 
SET @RowId += 1;      
END

1 个答案:

答案 0 :(得分:0)

我不是通过这种方式来执行此操作,而是通过在要转换为非字符串列的每个列上使用TRY_PARSE()或TRY_CONVERT()来处理此问题。

如果您随后需要将验证失败存储在另一个表中,则可以进行第二遍操作,以获取源表中具有非空值且目标表中具有空值的所有行,然后插入这些行进入“验证失败”表。