我正在使用SQL Server 2008 R2。我有2个表old
和new
以及大约500k行。
我需要将数据从old
转换为new
。有些专栏发生了变化。例如,在old
表中,许多列的类型为varchar
,而new
表int
。
我正在执行这样的查询:
INSERT INTO new (xxx)
SELECT FROM old (yyy)
并收到以下错误:
Msg 245,Level 16,State 1,Line 4
将nvarchar值'Tammi'转换为数据类型int时,转换失败。
此错误显示,old
表中的某些行包含列中的错误数据。 (人的因素)。
但是我怎么能找到这些错误的行呢?有可能吗?
如何找到错误数据列中的哪一列?
答案 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
返回其中两行(因为A
和0.5
无法转换为int
):