これは質問か他のSQL Serverユーザーの警告であるかわかりません。SQL ServerのISNUMERIC関数(マイナス記号のみ)
SQL ServerのISNUMERIC
関数を使用して、文字列が数値かどうかを判断します。しかし今日、私たちは、ユーザーが文字列としてマイナス記号を渡したという問題がありました。
SQL ServerのISNUMERIC
は、この文字列に対して1を返し、数値であることを示します。 CAST
この文字列をintに変換します(値は0にキャストされます)。数値にキャストすると失敗します。
DECLARE @str NVARCHAR(200)
SET @str = '-'
-- This returns 1 (i.e. this string IS a number)
SELECT ISNUMERIC(@str)
-- This works (and returns 0)
SELECT CAST(@str as int)
-- This throws an error of "Arithmetic overflow error converting nvarchar to data type numeric."
SELECT CAST(@str as numeric(12, 0))
-- This throws an error of "Arithmetic overflow error converting nvarchar to data type numeric."
SELECT CAST(@str as numeric(12, 7))
これが起こりそうな奇妙なケースはありますか?
私の一般的な感想:データがSQL Serverに入る前に '-'を' -1'に置き換えてください。これはビジネスロジックであり、おそらくあなたのアプリケーション層で役立つでしょう。 –
select isnumeric( '3.141e-09') - たとえば!あなたのニーズを正確に満たすためにLIKEで使用できる正規表現を試してみてください。ISNUMERICには多少の欠陥があります(私の例は有効な数字ですが) – Cato
'ISNUMERIC'は誰も尋ねたくない質問に答えます。 *数値データ型の* any *に変換されています(私はどちらを気にしないのですか)? " –