0

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)ます。

4

1 に答える 1

0

これはあなたの問題に関連すると思います。受け入れられた回答を確認してください。これは SQL Server のバグではありません。これは、一連の操作が手続き的ではないためです (これはほとんどの人にとってあまり明白ではありません)。

SQL Server Join でのキャスト順

お役に立てれば。

于 2013-10-18T21:57:27.817 に答える