2015-07-10 67 views
2

我试图将我从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 ..所以它是源系统的糟糕设计?

回答

2

尝试这个

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 
+0

仍然可以在我的表中只有一个错误没有行。 以粗体显示我的edidet问题 – Nils

1

如果您插入任何行失败,将在该批次中插入也将失败的所有行。

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

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

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

编辑:

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

+0

为什么我想在错误表中填入失败错误是因为如果最终用户输入空白值或其他一些真的不应该在该字段中的错误,我想将其视为错误。 我编辑我的问题,因为源系统具有nvarchar作为数据类型,当字段中的所有值应该是INT – Nils

+0

是否可以,我必须做一个光标她检查所有行? – Nils

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; 

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

0

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