SQLServer 2008 R2 を使用しています。2 つのテーブルがあります。1 つ目は属性テーブルです。2 番目には、属性テーブルを参照する列があります。2 つのテーブルは、varchar(32)
列を使用して結合されます。
#tblA #tblB
--------------------- ---------------------
attrib varchar(32) <---------> attrib varchar(32)
val nvarchar(255) [other fields]
[other fields]
クエリはテーブルを結合し、次のようにキャスト#tblA.val
しますint
。
create table #tblA (attrib varchar(32), val nvarchar(255) /*, other fields */)
insert into #tblA values ('vase', 'red'), ('x', '323'), ('y', '615')
create table #tblB (attrib varchar(32) /*, other fields */)
insert into #tblB values ('x'), ('y')
select b.*, cast(a.val as int) as int_val
from #tblA a inner join #tblB b on a.attrib = b.attrib
drop table #tblB, #tblA
この例は機能します:
attrib int_val
-------------------------------- -----------
x 323
y 615
ただし、何千ものレコードを含む本番テーブルに対して同じクエリを実行すると、次のエラーが発生します。Conversion failed when converting the nvarchar value 'vase' to data type int.
本番クエリからを削除するとcast()
、列の返されたデータval
に整数値のみが含まれていることがわかります。
SQL Server が返されたデータセットの一部ではない値を変換しようとするのはなぜですか? a.val
さらに奇妙なことに、に加えて選択リストに含めると、cast(a.val as int)
変換エラーは発生しません。誰もこれを見たことがありますか?SQL Server の単なるバグですか?
ところで - の使用convert(int, a.val)
には と同じ問題がありcast(a.val as int)
ます。