回答:
これは文書化された動作です。誰も設定を台無しにしたとは思わない。
MSDNのデータ型の優先順位を参照してください。
演算子が異なるデータ型の2つの式を結合する場合、データ型の優先順位の規則は、優先順位の低いデータ型が優先順位の高いデータ型に変換されることを指定します。
コメントに記載されているように、空の文字列は数値型では0に変換され、日付に変換されると1900-01-01 00:00:00.000に変換されます。
編集:あなたの本当の問題は、あなたのデザインが異なるデータ型のフィールドに参加しなければならないということだと思います。これを回避する唯一の方法は、クエリのパフォーマンスを低下させるjoin句に変換を設定することです。主な問題はおそらくスキーマ設計にあります
EDIT:多くの議論がチャットに移動されているコメントでした。しかし、それが見えるかもしれません不合理、他のデータタイプに空の文字列を変換する任意の値を生成します。
このコード:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
次の出力を生成します。
0
0
1900-01-01
1900-01-01 00:00:00.000
その場合、この動作は他の先行するデータ型間で一貫性があり、0を日付に変換すると同じ任意の値が生成されるが、そうではないと予測できます。
SELECT CONVERT(date, 0)
生産する
データ型intから日付への明示的な変換は許可されていません。
サポートされている変換ではないため
ながら
SELECT CONVERT(datetime, 0)
返品
1900年1月1日00:00:00
そうです、それは奇妙な、任意のですが、実際に文書化し、説明できます。
CAST('' AS INT)
-> 0はどこかに文書化されていますか?参照を追加するといいでしょう。