尝试......抓住...插入

时间:2015-07-10 08:42:41

标签: sql sql-server try-catch sql-insert

我正在尝试将我从select语句中获得的所有错误插入到错误表中,但我不能让它工作。

BEGIN TRY 
    INSERT INTO [database]..[Table]([Column1], [Column2], [Column3])
       SELECT 
           [Column1], [Column2], [Column3] 
       FROM 
           [database]..[SourceTable] 
END TRY
BEGIN CATCH
     INSERT INTO [database]..[ErrorTable]([Column1], [Column2], [Column3])
        -- What to do here? .... (select the same query as up?)
        SELECT 
            [Column1], [Column2], [Column3] 
        FROM [database]..[SourceTable]
END CATCH

现在我想看看我Error表中的所有错误以及表中的所有错误但是我不能让它工作?

源系统的数据类型为nvarchar,我的列为INT,因为这些值应该只是INT ..所以源系统设计不好?

4 个答案:

答案 0 :(得分:3)

试试这个

Begin Catch 

INSERT INTO [database]..[ErrorTable]
(
[Column1],
[Column2],
[Column3],
[Column4],
[Column5],
[Column5]
)
SELECT
    cast (ERROR_NUMBER() as <your datatype>)
    ,cast (ERROR_SEVERITY() as <your datatype>)
    ,cast (ERROR_STATE() as <your datatype>)
    ,cast (ERROR_PROCEDURE() as <your datatype>)
    ,cast (ERROR_LINE() as <your datatype>)
    ,cast (ERROR_MESSAGE() as <your datatype>)
End Catch

答案 1 :(得分:1)

如果插入中的任何行失败,那么将插入该批处理中的所有行也将失败。

  

- 这里做什么? ....(选择相同的查询?)

所以..是..相同的查询,因为即使只有一个失败,所有的行都被重定向。

你有什么理由认为他们会失败?主键?外键?任何其他约束或触发器? 如果是这种情况,您可以对数据集进行预先检查以查找缺少的键,并将这些行保存到错误表中,然后插入其余行,您甚至不需要try catch。

编辑:

在那些nvarchar且应该是INT的列中,您可以过滤行 其中patindex('%[^0-9]%',<YOUR COLUMN>) > 0,您将获得将无法进行数据类型转换的所有行。将这些行插入错误。其余的到你正确的目的地表。

答案 2 :(得分:1)

This blog这里帮助我的是一些示例代码:

CREATE TABLE SampleTable (ID INT IDENTITY(1,1), Col VARCHAR(10))
GO

BEGIN TRY
INSERT INTO SampleTable (Col)
SELECT 'FourthRow'
UNION ALL
SELECT 'FifthRow---------'
END TRY

BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
GO

答案 3 :(得分:0)

我建议您解决问题,而不是尝试捕获错误。因此,寻找不匹配的值,如下所示:

SELECT [Column1], [Column2], [Column3] 
FROM [database]..[SourceTable] 
WHERE Column1 LIKE '%[^0-9'%] OR
      Column2 LIKE '%[^0-9'%] OR
      Column3 LIKE '%[^0-9'%];

如果您使用的是SQL Server 2012,请使用try_convert()

SELECT [Column1], [Column2], [Column3] 
FROM [database]..[SourceTable] 
WHERE try_convert(int, Column1) is null OR 
      try_convert(Column2) is null OR
      try_convert(Column3) is null;

您可以使用类似的语句来插入正确的数据。