如何找到 SQL 查询失败的确切行
Posted
技术标签:
【中文标题】如何找到 SQL 查询失败的确切行【英文标题】:How to find exact row where SQL query fail 【发布时间】:2016-06-30 11:34:31 【问题描述】:我使用的是 SQL Server 2008 R2。我有 2 个表 old
和 new
以及大约 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
返回其中两行(因为A
和0.5
无法转换为int
):
【讨论】:
以上是关于如何找到 SQL 查询失败的确切行的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MySQL 将确切的行数加载到 jTable 并对剩余的行进行分页?