2009-06-18 14 views
1

これは以前の質問MSSQL: Change type of a column with numbers from varchar to intに似ていますが、この場合はすべての元のデータをvarcharからintに変換できません。このような場合、出力をちょうどNULLにします。SQLを使用して変換エラーを無視してデータベースの列の種類を変更します

たとえば、varchar列の値の入力セットは、{'123', '234', '345', 'A', '456'}のようになります。 varcharからintに変換した後、カラムに値{123, 234, 345, NULL, 456}が含まれるようにします。実際には、私は約99%の成功率を持っています。

一般的な解決策が理想的ですが、私はSQL Server 2005を使用しており、Transact SQLの変更を実行する必要があります。

編集:IsNumericの提案は、ギャップの一部を橋渡ししますが、完全ではありません。たとえば、データセットに数値データが含まれていても整数データではない場合は、IsNumeric修正が機能しません(IsIntegerは表示されません)。特に、次のセットは、{123.456、 '$ 12'}を変換しません.SQL Server IsNumericによれば両方とも数値ですが、Intには変換されません。

答えて

2
  1. 実行こうして更新:

    .. SET OldValueプロパティ= ISNUMERIC(OLDVALUE)が1つのELSE THEN OLDVALUE NULL END を= CASE ...

  2. 実行

    ALTER TABLE dbo.Mytable ALTER COLUMN OldValue int - 必要に応じてNULLまたはNOT NULLを追加します。

2
  1. この最初の実行:ISNUMERIC(フィールド)= 0

  2. そして周りにハッキングの時間後に型

2

を変更

更新テーブルセットフィールド= NULLおよび他の回答からのガイダンスでは、ここに私が思い付いたものがあります:

  1. データをクリーンアップして、情報が変換されるようにします。 IsInteger関数がないので、IsNumericを使用して、全く変換できないものをNULLに設定します。

  2. MONEYにすべてのデータを変換します。これにより、以前はIsNumericによって受け入れられた通貨記号が効果的に取り除かれます。

  3. は小数を取り除くために整数にお金の種類を変換します。

  4. 最後に、データ型を変更。

次のテストは、SQLを使用して示しています

CREATE TABLE tbl ( 
    id INTEGER IDENTITY NOT NULL, 
    col VARCHAR(20) 
) 

INSERT INTO tbl (col) VALUES ('123') 
INSERT INTO tbl (col) VALUES ('ABC') 
INSERT INTO tbl (col) VALUES ('123.456') 
INSERT INTO tbl (col) VALUES ('$12') 

UPDATE tbl SET col = CASE WHEN IsNumeric(col) = 1 THEN Convert(INTEGER, (Convert(MONEY, col))) ELSE NULL END 
ALTER TABLE tbl ALTER COLUMN col INTEGER 

SELECT * FROM tbl 
関連する問題