我有以下插入查询,该查询从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
答案 0 :(得分:0)
我不是通过这种方式来执行此操作,而是通过在要转换为非字符串列的每个列上使用TRY_PARSE()或TRY_CONVERT()来处理此问题。
如果您随后需要将验证失败存储在另一个表中,则可以进行第二遍操作,以获取源表中具有非空值且目标表中具有空值的所有行,然后插入这些行进入“验证失败”表。