以毫秒为单位获取错误的行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 算术溢出错误将数值转换为数据类型数值。 该声明已被终止。
编辑:有不同字段类型的表中有多个字段。所以数字类型只是一个例子。
请尝试以下方法:
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
他在SQL 2005上。 – SQLChao 2014-09-04 13:54:45
D'oh!新答案: 第1步。升级SQL Server环境。 步骤2. ???? ... – 2014-09-04 13:56:05
你可以将其转换为一个循环进行调试。 – 2014-09-04 13:31:09
现在我做到了。循环通过。但不太有效,因为它非常缓慢。表现并不是最好的。 – Blackstar 2014-09-04 13:33:17
但你只是想知道行号。我假定找到无效数据的来源。一旦你解决了核心问题,你可以再次使用基于集合的方法。 – 2014-09-04 13:37:17