2

データをVarchar列から数値データ型に変換したいので、変換する
前にISNUMERIC関数を呼び出して、データが数値であるかどうかを確認し、そうである場合は数値データ型に変換します。しかし、私は問題に直面してい
ます-IsNumeric関数が期待どおりに動作していません-

- IsNumeric(x) returns true - when varchar value has both comma and a tab character (Char(9)), 
- IsNumeric(x) returns false - when varchar value has only tab character and no comma

それは以下のSQLの助けを借りて説明されています-

DECLARE @propValue AS VARCHAR(50)
SET @propValue = '1,592 ' -- contains comma + tab (Char(9))
SELECT ISNUMERIC(@propValue)  -- Returns 1 

--If ISNUMERIC func returns true for this value, lets convert this Varchar value to Numeric
SELECT CAST(@propValue AS Numeric(19, 4)) -- :-( Error converting data type varchar to numeric.

私はグーグルで検索し、この問題に取り組むためのさまざまな解決策を見つけました-

--Solution 1: use 'e0'
SELECT ISNUMERIC(@propValue + 'e0')  -- Returns 0

--Solution 2: remove comma before calling IsNumeric()
SELECT ISNUMERIC(REPLACE(@propValue, ',', ''))  -- Returns 0

--Solution 3
--Call CLR function to parse Varchar value

上記のシナリオで推奨される解決策とその理由は何ですか?
また、IsNumeric(x)がfalseを返す理由を誰かが説明できれば本当にありがたいです-varchar値にタブ文字のみがあり、コンマがない場合はどうなりますか?

ありがとうございました!

4

2 に答える 2

1

ISNUMERIC() = 1これは、「すべての数値タイプに変換できる」という意味ではなく、「少なくとも1つの数値タイプに変換できる」という意味であることに注意してください。これは、値を少なくとも1つの数値タイプに変換できるが、必要なタイプには変換できない場合によく発生します。より基本的な例:

IF ISNUMERIC(256) = 1
  SELECT CONVERT(TINYINT, 256);

既知の違反(タブなど)がある文字列がある場合は、タブも置き換えてみませんか?そもそもガベージデータがこの値に入るのを防いでみませんか?

これは機能しますが、かなり醜いです:

DECLARE @x TABLE (propValue VARCHAR(50));

INSERT @x SELECT '1,592' + CHAR(9)
UNION ALL SELECT '55' + CHAR(9) + '32'
UNION ALL SELECT CHAR(9) + '7,452.32    '
UNION ALL SELECT 'foo'
UNION ALL SELECT '74';

SELECT CONVERT(NUMERIC(19,4), 
LTRIM(RTRIM(REPLACE(REPLACE(propValue, CHAR(9), ''), ',', '')))
)
FROM @x
WHERE ISNUMERIC(LTRIM(RTRIM(REPLACE(REPLACE(propValue, 
  CHAR(9), ''), ',', ''))) + 'e0') = 1;

あなたの正確な質問には当てはまりませんが、私はこれについて10年前にFAQを書きました:http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html

于 2012-07-02T01:59:21.027 に答える
-1
ISNUMERIC(RTRIM(LTRIM(x))) = 1
于 2012-07-01T19:57:02.817 に答える