2016-06-30 4 views
1

SQL Server 2008 R2を使用しています。私は2つのテーブルoldnewと約500kの行を持っています。SQLクエリが失敗する正確な行を見つける方法

データをoldからnewに変換する必要があります。一部の列が変更されました。たとえば、oldのテーブルでは、多くの列がvarcharのタイプで、newのテーブルintのタイプです。

私はこのようなクエリを実行しています:old表の列に間違ったデータと一部の行であることを、

Msg 245, Level 16, State 1, Line 4
Conversion failed when converting the nvarchar value 'Tammi ' to data type int.

このエラーショー:

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

し、エラーを次取得。 (ヒューマンファクター)。

しかし、これらの間違った行を見つけるにはどうすればよいですか?出来ますか?

どのような列に間違ったデータが存在するのを見つけることができますか?

+0

チェックこの回答 - のhttp: //stackoverflow.com/q/10517777/1080354 – gotqn

+0

クエリには、使用されている* single *列、 'yyy'のみが表示されます。 –

答えて

2

これは痛みです。しかし、int型に変換できない値を見つけるために、これを試してください:SQL Serverの2012+では

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

は、あなたがtry_convert()を使用することができます。

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

私は 'old'テーブルに50列以上あります:) – Lari13

+1

@ Lari13なので何ですか? :)その50回する。 –

+0

@ Lari13もしあなたが* text *データを持つ50個のカラムを持っていれば、整数カラムにそれらを強制するべきではありません。まずデータを分析して、データに誤りがあるのか​​、単に整数列を使用すべきでないのかを判断する必要があります。 SSISには、あなたの部分から何の努力もせずにソースを分析できるタスクがあります。 –

0

は、あなたがこのT-SQL文が生成したコードを実行する可能性(テーブル名だけを変更):

0123:例については、

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 

スクリプトには、この文を生成します(A0.5intに変換することができないので)

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

行の2を返す:

enter image description here

関連する問題