聽起來像,因爲你有數字數據存儲在一個字符串列,你有錯誤的數據。識別它的方法之一是:
SELECT key_column, ORIGBAL
FROM dbo.tablename
WHERE ORIGBAL LIKE '%[^-.0-9]%';
修正數據(可能包含逗號,但可能的傷害比這更糟糕,像一些價值觀具有完全非數字數據 - 否則轉換爲MONEY
應該有工作) 。如果您發現很多行包含逗號,則可以簡單地運行更新:
UPDATE dbo.tablename SET ORIGBAL = REPLACE(ORIGBAL, ',', '');
然後再次運行上述查詢。如果沒有行被返回,現在你可以轉換爲「普通」數字類型,而不是MONEY
或FLOAT
,這真的應該保留用於特定的場景恕我直言。
沒有固定的數據,你可以讓你的生活更加複雜,在所有的查詢使用CASE
表達:
SELECT key_column, CONVERT(DECIMAL(12,2), CASE
WHEN ORIGBAL LIKE '%[^-.0-9]%' THEN ORIGBAL END
FROM dbo.tablename
...
這將產生NULL
值,而不是壞的,非數值。然而,它仍然可能失敗,例如該表達式將通過0.0.0.44.02
,這顯然不能轉換爲小數。舉個例子:
DECLARE @x TABLE(ORIGBAL NVARCHAR(255));
INSERT @x VALUES('bob'),('0.0.0.44.02'),('32500.40');
SELECT ORIGBAL, [status] = CASE WHEN ORIGBAL LIKE '%[^.0-9]%'
THEN 'needs correcting' ELSE 'all good' END
FROM @x;
結果:
bob needs correcting
0.0.0.44.02 all good
32500.40 all good
爲了識別與多個小數點的情況下,你可以這樣做:
SELECT ORIGBAL, [status] = CASE WHEN ORIGBAL LIKE '%[^.0-9]%'
OR LEN(ORIGBAL)-LEN(REPLACE(ORIGBAL,'.','')) > 1
THEN 'needs correcting' ELSE 'all good' END
FROM @x;
結果:
bob needs correcting
0.0.0.44.02 needs correcting
32500.40 all good
你還是可能具有超過最終值的值轉換,例如'123456789.56'
對於DECIMAL(12,2)
太大。
在SQL Server 2012中,你將有速記上述表達式:
SELECT key_column, TRY_CONVERT(DECIMAL(12,2), ORIGBAL)
FROM dbo.tablename
...
...這將產量甚至像0.0.0.44.02
更復雜的值NULL
值。
你能展示一些數據,你想轉換的例子嗎? –