database:sqlserver:hex_is_numeric

ISNUMERIC関数は16進文字列を数値と見なす場合がある

 '1E34' のように数字の後に'E'が一つだけ含まれる場合、ISNUMERIC関数は 1 を返してしまう。(恐らく指数と判定している。期待した動作にならない。)

DECLARE @HexVal VARCHAR(4)
SET @HexVal = '1E34'
 
IF ISNUMERIC(@HexVal) = 1
BEGIN
	SELECT CAST(@HexVal AS INT)
END
ELSE
BEGIN
	PRINT '数値以外です。(' + @HexVal + ')'
END

実行結果:

メッセージ 245、レベル 16、状態 1、行 6
varchar の値 '1E34' をデータ型 int に変換できませんでした。

 'E234' は期待した動作になる。

DECLARE @HexVal VARCHAR(4)
SET @HexVal = 'E234'
 
IF ISNUMERIC(@HexVal) = 1
BEGIN
	SELECT CAST(@HexVal AS INT)
END
ELSE
BEGIN
	PRINT '数値以外です。(' + @HexVal + ')'
END

実行結果:

数値以外です。(E234)


LIKEでチェックすると正しく判定できる。

DECLARE @HexVal VARCHAR(4)
SET @HexVal = '1E34'
 
IF CASE WHEN @HexVal LIKE'%[A-F]%' THEN 0 ELSE 1 END = 1
BEGIN
	SELECT CAST(@HexVal AS INT)
END
ELSE
BEGIN
	PRINT '数値以外です。(' + @HexVal + ')'
END

実行結果:

数値以外です。(1E34)
  • database/sqlserver/hex_is_numeric.txt
  • 最終更新: 2019/05/18 02:23
  • by 非ログインユーザー