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

Posted

技术标签:

【中文标题】如何找到 SQL 查询失败的确切行【英文标题】:How to find exact row where SQL query fail 【发布时间】:2016-06-30 11:34:31 【问题描述】:

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

我需要将数据从old 转换为new。某些列已更改。例如,在old 表中,许多列的类型为varchar,在new 表中为int

我正在执行这样的查询:

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

并得到以下错误:

消息 245,第 16 级,状态 1,第 4 行 将 nvarchar 值“Tammi”转换为数据类型 int 时转换失败。

此错误表明,old 表中有一些列中的数据错误的行。 (人的因素)。

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

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

【问题讨论】:

检查这个答案 - ***.com/q/10517777/1080354 您的查询仅显示使用了一个单个列,yyy 【参考方案1】:

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

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;

【讨论】:

old 表中有超过 50 列。:) @Lari13 那又怎样? :) 这样做 50 次。 @Lari13 如果您有 50 列包含 text 数据,则不应尝试将它们强制转换为整数列。您应该首先分析您的数据并确定数据是否有误,或者您根本不应该使用整数列。 SSIS 的任务可以在您不付出任何努力的情况下分析来源 这就是问题所在,如何快速找到wrong rows。我在这里找到了答案mssqltips.com/sqlservertip/1522/… @Lari13 实际上,这与 Gordon 的第一个查询相同。您最初的问题只提到了一个 single【参考方案2】:

你能执行这个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):

【讨论】:

以上是关于如何找到 SQL 查询失败的确切行的主要内容,如果未能解决你的问题,请参考以下文章

如何替换 FMDB 中的特定行?

如何在 Oracle SQL 中查找最具体的匹配行

如何从 MySQL 将确切的行数加载到 jTable 并对剩余的行进行分页?

mysql如何查询SQL中哪些语句执行最占用CPU?

SQL alwayson 辅助接点查询统计信息“丢失”导致查询失败

如何使用 SQL 查询连接两个表? [复制]