2009-06-18 15 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)。特別是,以下集合不會根據SQL Server IsNumeric轉換{'123.456','$ 12'},它們都是數字,但不會轉換爲Int

回答

2
  1. 因而運行的更新:

    .. SET =的OldValue CASE WHEN ISNUMERIC(OLDVALUE)= 1 THEN ELSE OLDVALUE NULL END ...

  2. 運行

    ALTER TABLE dbo.Mytable ALTER COLUMN OldValue int - 根據需要添加NULL或NOT NULL

2
  1. 執行此第一:

    更新表組場= NULL其中ISNUMERIC(場)= 0

  2. 然後改變類型

2

一小時後黑客周圍的和在其他答案的指導下,這裏是我想出的:

  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