2009-08-25 133 views
1

在磨難昨天,我才知道,你無法通過這個查詢EXEC():爲什麼SQL Server要求將INT轉換爲NVARCHAR?

@SQL = @SQL + 'WHERE ID = ' + @SomeID 
EXCEC(@SQL) 

凡@SomeID是INT和@SQL是NVARCHAR。這會抱怨在執行期間無法將NVARCHAR轉換回INT。

我意識到你必須要做得像

@SQL = @SQL + 'WHERE ID = ' + CONVERT(NVARCHAR(20), @SomeID) 

什麼我不明白是爲什麼呢?爲什麼SQL Server僅僅在+對NVARCHAR進行操作時才理解INT?我猜它與char集有關。

編輯:修正了錯別字(錯過了一些+:s)。

回答

2

+(字符串串聯)

在字符串表達式 連接兩個或更多個 字符或二進制串,列, 或字符串和列的組合操作者名稱合併爲一個表達式(字符串 運算符)。

表達是 的任何數據類型的任何有效的微軟SQL服務器™ 表達除圖像,ntext或 文本數據類型的字符和二進制 數據類型類別。兩個表達式必須爲 必須是相同的數據類型,或一個 表達式必須能夠將 隱式轉換爲其他表達式的數據類型 。

所以......有數據類型爲int的字符串沒有隱含皈依......這是一個內部問題

+0

接下來的問題當然是爲什麼int沒有隱式轉換爲字符串,但我想我只需要忍受它。 – 2009-08-25 06:49:35

+1

我想這是不允許的,因爲它太容易出錯(有可能會丟失數據(如果nvarchar字段太短...),同樣的方式,你不能將int轉換爲bool在C# – 2009-08-25 06:59:03

+1

但是可以將INT隱式轉換爲NVARCHAR,因爲可以將NVARCHAR隱式轉換爲INT。請參閱http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx上的圖表。 ,當看到一個數字爲+的運算符,另一端使用char/nchar/varchar/nvarchar時,SQL Server將嘗試隱式轉換爲數字類型,然後執行一個添加,而不是將數字轉換爲字符串並進行協調。如果你想要另一個,你必須使用顯式轉換。 – 2009-08-25 17:09:48

1

我不是說這肯定會工作,我不靠近我的SQL管理工作室發佈前嘗試一下,但你有沒有嘗試過這樣的事情:

@SQL = @SQL + 'Where ID = ' + @SomeID 
EXEC(@SQL) 
+0

膽鹼!這是一個錯字。我的錯。 +一個發現,糾正而不嘲笑我。 ;) – 2009-08-25 06:44:06