1

SQL Serverでこのアドホッククエリを試してみると(UserIdNVARCHARフィールドであると想定):

SELECT * FROM MyUser WHERE UserId = 123456

このエラーが発生します:

メッセージ245、レベル16、状態1、行1
nvarchar値'foo'をデータ型intの列に変換する際の構文エラー。

明らかに'foo'、私の列のどこかに値がありUserIdます。

SQL Serverが、検索値をNVARCHARに変換するという、私には明らかなことを行うのではなく、列全体をINTEGERに変換しようとするのはなぜですか?

4

3 に答える 3

3

比較は、Data Type Precedenceのルールを使用して行われます。

演算子が異なるデータ型の 2 つの式を結合する場合、データ型の優先順位の規則により、優先順位の低いデータ型が優先順位の高いデータ型に変換されることが指定されます。

NVARCHARタイプ (優先度 25) は (優先度 16) に変換されますint。優先順位 1 は「最高」を意味することに注意してください。

于 2010-11-19T16:55:04.543 に答える
2

これは、異なるタイプの2つの値を比較できないためだと思います。次に、いずれかの等式比較メンバーを同じタイプに変換する必要があります。ここintが好まれていると思います。

anintは型よりも優先されると思うnvarcharので、暗黙的nvarcharにint値に変換しようとする必要があります。

編集#1

「しかし、私が与えた値を、その逆ではなく、検索しているフィールドのタイプに変換しようとするのは賢明ではないでしょうか?」

はい、そうならこれはいいでしょう。しかし、それは、他の種類の比較を試みるときに、変換の試みが多すぎるためだと思います。

where dateOfBirth = 1976-6-16

vs

where dateOfBirth = N'1976-06-16'

最初の例では、ユーザーの意図は何ですか?dateOfBirthがの日付値に等しいかどうかを確認するか1976-06-16、の整数値と比較するか、1976 - 6 - 16結果はに1954なります。これは、任意の日付の年と見なすのに十分合理的である可能性があります。

nvarcharのような暗黙の変換があると思いますがdatetime、カバーすることがたくさんあるので、それらは可能な限り最も一般的な変換に限定されていました。

于 2010-11-19T16:51:30.127 に答える
1

列が NVARCHAR であることがわかっているのに、なぜ整数値を指定するのですか?

残念ながら、SQL Server は、多くの SQL 実装と同様に、型のサポートにおいて他の言語に大きく遅れをとっています。通常、型チェックは実行時にのみ実行されます。したがって、あなたのようなクエリは、ここにあるような問題を強調するために構文チェックされていません。さまざまな型が一致していないため、クエリに問題がありますが、SQL Server はそれを検証しないため、データによっては結果が予測できなくなります。

于 2010-11-19T17:15:13.277 に答える