SQLServerの挙動について

Anonymous
2022-02-24T01:04:41+00:00

1.以下のテーブルを作成します。

CREATE TABLE [dbo].[##TEST](

 [ReqNo] [char] NOT NULL,

 [ReqNoE] [int] NOT NULL,

 PRIMARY KEY NONCLUSTERED (

 [ReqNo] ASC,

 [ReqNoE] ASC

)) ON [PRIMARY]

GO

2.次に以下のクエリを発行します。

INSERT INTO ##TEST VALUES ('0000000000',1,NULL);

SELECT * FROM ##TEST WHERE [ReqNo]=0;

2.の結果はReqNo='0000000000'の行が返却されます。

3.次に以下のクエリを発行します。

INSERT INTO ##TEST VALUES ('2200000000',1,NULL);

SELECT * FROM ##TEST WHERE [ReqNo]=0;

3.の結果は「varchar の値 '2200000000' の変換が int 型の列でオーバーフローしました。」となります。

検索結果が0件であればまだ納得できますがエラーになるのは間違っていると思います。

この様な報告は何処にすれば良いのでしょうか?

SQL サーバー | その他

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。 プライバシーを保護するために、移行された質問のユーザー プロファイルは匿名化されます。

0 件のコメント コメントはありません
{count} 件の投票

1 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2022-02-24T03:14:06+00:00

    > [ReqNo] char NOT NULL> INSERT INTO ##TEST VALUES ('2200000000',1,NULL);> SELECT * FROM ##TEST WHERE [ReqNo]=0;> varchar の値 '2200000000' の変換が int 型の列でオーバーフローしました。

    SQL Server の仕様通りの結果でしょう。

    Transact-SQL (T-SQL) Reference: Data type conversion (Database Engine)

    Transact-SQL (T-SQL) Reference: Data type precedence (Transact-SQL)

    ・データ型が異なる値同士を比較しようとする際、暗黙的に
     優先順位の低いデータ型を優先順位の高いデータ型に
     変換しようとする。

    ・char 型の値と整数リテラル( int 型の値)を比較する場合、、
     char 型の優先順位( 28 位)よりも int 型の優先順位( 16 位)の方が
     高いため、char 型の値を int 型に型変換できるかどうかを試行する。

    ・'0000000000'のように「数字のみで構成された文字列」であれば
     「基本的には」数値データへの変換が可能ではあるが、実際には
     変換先となるデータ型の有効範囲による制限を受ける。

    ・int 型の有効範囲は -2,147,483,648 から 2,147,483,647 までである。

    ・したがって、'2200000000' という文字列を
     2,200,000,000 という int 型の数値に変換しようとしても
     int 型の有効範囲を超えているため、オーバーフローエラーが発生する。

    3 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません