我正在尝试将我从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 ..所以源系统设计不好?
答案 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;
您可以使用类似的语句来插入正确的数据。