文書の表示以前のリビジョンバックリンク文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== ISNUMERIC関数は16進文字列を数値と見なす場合がある ====== '1E34' のように数字の後に'E'が一つだけ含まれる場合、ISNUMERIC関数は 1 を返してしまう。(恐らく指数と判定している。期待した動作にならない。) <code tsql> DECLARE @HexVal VARCHAR(4) SET @HexVal = '1E34' IF ISNUMERIC(@HexVal) = 1 BEGIN SELECT CAST(@HexVal AS INT) END ELSE BEGIN PRINT '数値以外です。(' + @HexVal + ')' END </code> 実行結果: <code> メッセージ 245、レベル 16、状態 1、行 6 varchar の値 '1E34' をデータ型 int に変換できませんでした。 </code> 'E234' は期待した動作になる。\\ <code tsql> DECLARE @HexVal VARCHAR(4) SET @HexVal = 'E234' IF ISNUMERIC(@HexVal) = 1 BEGIN SELECT CAST(@HexVal AS INT) END ELSE BEGIN PRINT '数値以外です。(' + @HexVal + ')' END </code> 実行結果: <code> 数値以外です。(E234) </code> \\ LIKEでチェックすると正しく判定できる。\\ <code tsql> 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 </code> 実行結果: <code> 数値以外です。(1E34) </code> database/sqlserver/hex_is_numeric.txt 最終更新: 2019/05/18 02:23by 非ログインユーザー