32

SQL Server 2008 R2 を使用しており、変換VARCHARしたい列があります。しかし、これらの行の多くは形式が正しくないため、数値に解析することはできません。その場合、結果を 0 または NULL に設定してそれらをスキップしたいだけです。DECIMAL(28,10)CONVERT

TRY_CONVERT()SQL Server 2012 ( ) に便利な新しいステートメントがあることは知っています。

これは 2008 年に可能ですか、それとも次のバージョンの SQL 2012 に更新するまで待つ必要がありますか?

編集

残念ながらISNUMERIC()、この場合は信頼できません。私は試した

ISNUMERIC(myCol) = 1

CONVERTに変換できない行に対して true を返しますDECIMAL

4

8 に答える 8

5

これは恒久的な変更であるため、最初に無効なテキストを削除し、次に列を変換するという 2 段階のプロセスで行います。

無効なテキストを削除するには、次のようにします。

UPDATE [Table]
SET [Column] = NULL
WHERE [Column] LIKE '%[^0-9.]%' or
LEN([Column]) - LEN(REPLACE([Column],'.','')) > 1 or
LEN([Column]) > 28

それが完了したら、列の定義を変更するだけで、残っているすべてのものを変換できるはずです

ALTER TABLE [Table] ALTER COLUMN [Column] decimal(28,10)
于 2013-07-30T07:55:43.750 に答える
4

C# で独自のカスタム パーサーを作成し、SQLCLR を使用できますDecimal.Parse()。を使用しないでください。これISNUMERIC正しくないことで知られています (CAST に失敗した文字列に対して TRUE を返します)。

于 2013-07-30T07:45:06.417 に答える
3

最後に、SO と Google の助けを借りて作成する方法を見つけました。

更新ステートメント:

UPDATE PriceTerm 
SET PercentAddition = CONVERT(decimal(28,10), RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.'), '&', '')))) 
WHERE AdditionalDescription LIKE '%[%]%' AND
dbo.isreallynumeric(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(AdditionalDescription,'%',''), ',','.'), '&', '')))) = 1 AND
PercentAddition = 0

最初に、ほとんどの場合、パーセント値のマーカーとして使用される % char を検索します。しかし、ランダムな他の用途もあります。私の場合、ISNUMERIC は信頼できないことがわかりました。

本当に違いがあるのは、ストアド プロシージャ isreallynumeric from hereの呼び出しです。

そう

CREATE FUNCTION dbo.isReallyNumeric  
(  
    @num VARCHAR(64)  
)  
RETURNS BIT  
BEGIN  
    IF LEFT(@num, 1) = '-'  
        SET @num = SUBSTRING(@num, 2, LEN(@num))  

    DECLARE @pos TINYINT  

    SET @pos = 1 + LEN(@num) - CHARINDEX('.', REVERSE(@num))  

    RETURN CASE  
    WHEN PATINDEX('%[^0-9.-]%', @num) = 0  
        AND @num NOT IN ('.', '-', '+', '^') 
        AND LEN(@num)>0  
        AND @num NOT LIKE '%-%' 
        AND  
        (  
            ((@pos = LEN(@num)+1)  
            OR @pos = CHARINDEX('.', @num))  
        )  
    THEN  
        1  
    ELSE  
    0  
    END  
END  
GO 
于 2013-07-30T09:16:24.437 に答える