以毫秒为单位获取错误的行ID sql

问题描述:

我有一个INSERT语句,它将大量数据插入tableB的tableA中。
这里是一个非常简单的代码例如:以毫秒为单位获取错误的行ID sql

INSERT [dbo].[tableA] 
SELECT field1 [field_1] 
FROM [dbo].[tableB] 
WHERE [codeID] IN (SELECT [codeID] FROM #tempTable WHERE RecordMarker = 1) 

有一个临时表至极抱codeIDs(至少1个或更多个)需要插入到表A。

但是tableB中会有不合法的数据,无法插入tableA中。例如,一个数字(30,2)字段不能映射到数字(13,2)。在这种情况下,我得到一个excetpion,声明已被终止。

如何获取CodeID或tableB中的错误行号如果出现错误?现在我只有错误信息但没有行号。

例如: 消息8115,级别16,状态8,行1 算术溢出错误将数值转换为数据类型数值。 该声明已被终止。

编辑:有不同字段类型的表中有多个字段。所以数字类型只是一个例子。

+2

你可以将其转换为一个循环进行调试。 – 2014-09-04 13:31:09

+0

现在我做到了。循环通过。但不太有效,因为它非常缓慢。表现并不是最好的。 – Blackstar 2014-09-04 13:33:17

+1

但你只是想知道行号。我假定找到无效数据的来源。一旦你解决了核心问题,你可以再次使用基于集合的方法。 – 2014-09-04 13:37:17

请尝试以下方法:

INSERT [dbo].[tableA] 
SELECT field1 [field_1] 
FROM [dbo].[tableB] 
WHERE [codeID] IN (SELECT [codeID] FROM #tempTable WHERE RecordMarker = 1) 
AND [codeID] <= 9999999999999.99; 

INSERT ErrorLog 
SELECT * 
FROM [dbo].[tableB] 
WHERE [codeID] > 9999999999999.99; 

如果你知道你有这个问题的目标字段的类型,在这种情况下的(13,2)精度的数字,你可以运行在潜在问题字段上对TRY_CONVERT选择临时表并筛选NULL结果。如果你想确保它能够成功运行并且不尝试插入那些“坏”行,你可以在你的插入语句中添加一个WHERE子句。

CREATE TABLE #t (x NUMERIC(30,2),field2 varchar(10)) 
INSERT INTO #t 
SELECT 123456789.23,'x' 
UNION 
SELECT 12345678901212343.23,'y' 
UNION 
SELECT 12345678923523523235.23,'z' 
UNION 
SELECT 42.0, 'a' 
SELECT *, TRY_CONVERT(NUMERIC(13,2),x,1) [Converted to numeric(13,2)] FROM #t 

参考:http://msdn.microsoft.com/en-us/library/hh230993.aspx

+0

他在SQL 2005上。 – SQLChao 2014-09-04 13:54:45

+0

D'oh!新答案: 第1步。升级SQL Server环境。 步骤2. ???? ... – 2014-09-04 13:56:05