2013-10-18 81 views
0

我正在使用SQLServer 2008 R2。我有兩個表,第一個是屬性表。第二個有一個引用屬性表的列。這兩個表格使用varchar(32)列連接。轉換/投射錯誤,NVARCHAR到INT

#tblA        #tblB 
---------------------    --------------------- 
attrib varchar(32) <---------> attrib varchar(32) 
val nvarchar(255)     [other fields] 
[other fields] 

查詢聯接表和施放#tblA.valint

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)有同樣的問題。

+0

使用上面給定的數據,您不應該得到匹配的行。如果更改第二個表插入以插入#tblB值('花瓶'),('底部') - 錯誤被正確引發。 – NoChance

+0

對不起 - 我在發佈問題之前調整了示例。沒有注意到'top'和'bottom'仍然被插入到#tblB中。我打算使用'x'和'y'。 –

+0

不太確定爲什麼你得到這個,但可能是與非數字數據匹配的行(例如,某些數據可能有不顯示的特殊字符)或某些前導空白或空值。另一種可能性可能是匹配行中的值超出了整數限制。我想你可以很快地驗證這兩種情況。 – NoChance

回答

0

我認爲這將與您的問題有關。請檢查接受的答案。這不是一個SQL Server的錯誤。這是因爲操作的順序不是程序性的(對大多數人來說這不是很明顯)。

Cast Order in SQL Server Join

希望這有助於。

+0

這真的有幫助。這正是我正在尋找的。謝謝! –