我正在使用SQLServer 2008 R2。我有兩個表,第一個是屬性表。第二個有一個引用屬性表的列。這兩個表格使用varchar(32)
列連接。轉換/投射錯誤,NVARCHAR到INT
#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
然而,當我運行相同的查詢對我生產的表數千條記錄,出現錯誤:將nvarchar值'vase'轉換爲數據類型int時轉換失敗。
如果我從我的生產查詢中刪除cast()
,我可以看到返回的數據爲val
列僅包括整數值。
爲什麼SQL Server嘗試轉換不屬於返回數據集的一部分的值?更奇怪的是,如果除了cast(a.val as int)
之外,我還在選擇列表中包含a.val
,則不存在轉換錯誤。有沒有人見過這個?它只是SQL Server中的一個錯誤嗎?
順便說一句 - 使用convert(int, a.val)
與cast(a.val as int)
有同樣的問題。
使用上面給定的數據,您不應該得到匹配的行。如果更改第二個表插入以插入#tblB值('花瓶'),('底部') - 錯誤被正確引發。 – NoChance
對不起 - 我在發佈問題之前調整了示例。沒有注意到'top'和'bottom'仍然被插入到#tblB中。我打算使用'x'和'y'。 –
不太確定爲什麼你得到這個,但可能是與非數字數據匹配的行(例如,某些數據可能有不顯示的特殊字符)或某些前導空白或空值。另一種可能性可能是匹配行中的值超出了整數限制。我想你可以很快地驗證這兩種情況。 – NoChance