如何找到SQL查询失败的确切行

时间:2016-06-30 11:34:32

标签: sql-server sql-server-2008-r2

我正在使用SQL Server 2008 R2。我有2个表oldnew以及大约500k行。

我需要将数据从old转换为new。有些专栏发生了变化。例如,在old表中,许多列的类型为varchar,而newint

我正在执行这样的查询:

INSERT INTO new (xxx)
    SELECT FROM old (yyy)

并收到以下错误:

  

Msg 245,Level 16,State 1,Line 4
  将nvarchar值'Tammi'转换为数据类型int时,转换失败。

此错误显示,old表中的某些行包含列中的错误数据。 (人的因素)。

但是我怎么能找到这些错误的行呢?有可能吗?

如何找到错误数据列中的哪一列?

2 个答案:

答案 0 :(得分:2)

这是一种痛苦。但是,要查找无法转换为整数的值,请尝试以下方法:

select yyyy
from old
where yyyy like '%[^0-9]%';

在SQL Server 2012+中,您可以使用try_convert()

select yyyy
from old
where try_convert(int, yyyy) is null;

答案 1 :(得分:0)

您是否可以执行此T-SQL语句生成的代码(只需更改表名):

DECLARE @TableName SYSNAME = 'DataSource'

SELECT 'SELECT * FROM ' + @TableName + ' WHERE ' +
STUFF
(
    (
        SELECT 'OR ISNUMERIC([' + name + '] + ''.e0'') = 0 '
        FROM sys.columns
        WHERE object_id = OBJECT_ID(@TableName)
        FOR XML PATH(''), TYPE
    ).value('.', 'VARCHAR(MAX)')
    ,1
    ,3
    ,''
);

例如,如果我们有下表:

IF OBJECT_ID('DataSource') IS NOT NULL
BEGIN
    DROP TABLE DataSource;
END; 
GO

CREATE TABLE DataSource  
(
    A VARCHAR(12)
   ,B VARCHAR(12)
   ,C VARCHAR(12)
);

GO

INSERT DataSource ([A], [B], [C])
VALUES ('1', '2', '3')
      ,('0.5', '4', '2')
      ,('1', '2', 'A');

GO

该脚本将生成以下语句:

SELECT * FROM DataSource WHERE ISNUMERIC([A] + '.e0') = 0 OR ISNUMERIC([B] + '.e0') = 0 OR ISNUMERIC([C] + '.e0') = 0 

返回其中两行(因为A0.5无法转换为int):

enter image description here