2017-06-19 183 views
2

我創建了一個名爲vReceivedEmail的視圖,其中包含一個名爲的Varchar列RowPrimaryKeyValue。此列通常存儲主鍵ID值,例如567781,但每隔一段時間都有描述性文本「Ad hoc消息」。將列var上的varchar轉換爲int列轉換爲int

我已將視圖設置爲僅顯示可保存主鍵值的記錄,然後將該列作爲int

SELECT  CAST(Email.RowPrimaryKeyValue as int)   as DetailID 
FROM  MessageStore.dbo.Email Email 
WHERE  ISNUMERIC(Email.RowPrimaryKeyValue) = 1 

當我測試的看法,我只得到記錄,與我想象中的主鍵值,當我看着列清單在對象資源管理器視圖,列被保存在int數據類型。

我然後試圖應用以下WHERE子句中一個單獨的查詢,引用我保存的視圖:

SELECT  PotAcc.DetailID 
FROM  PotentialAccounts PotAcc 
WHERE  PotAcc.DetailID NOT IN (
       SELECT  RecEmail.DetailID 
       FROM  vReceivedEmail RecEmail 
      ) 

...但我返回了以下錯誤:

Conversion failed when converting the varchar value 'Ad hoc message' to data type int.

'Ad hoc消息'是來自我過濾並轉換爲int的列的數據,但我不知道它是如何管理的,因爲視圖顯式地過濾掉並將列轉換爲int。

回答

4

既然你的SQL Server 2012上,有關使用try_convert(int,RowPrimaryKeyValue) is not null代替isnumeric()怎麼樣?

你的觀點看起來就像這樣:

select try_convert(int, RowPrimaryKeyValue) as DetailID 
from MessageStore.dbo.Email Email 
where try_convert(int, RowPrimaryKeyValue) is not null 

在SQL Server 2012及以上:每個將返回null當轉換失敗而不是錯誤。

+0

不錯。之前沒有使用'try_convert',所以今天學到了一些新東西。非常感謝。 –

+0

很好的版本 – scsimon

2

Isnumeric()可以欺騙...但我敢打賭這是由於SQL Server優化。雖然您的視圖有效,但這並不意味着外部查詢將保證只返回INT。而不是使用視圖...使用CTE並嘗試。而且,因爲你是在2012年,所以可以避免以上SqlZim的解釋。

WITH CTE AS(
SELECT  CAST(Email.RowPrimaryKeyValue as int)   as DetailID 
FROM  MessageStore.dbo.Email Email 
WHERE  ISNUMERIC(Email.RowPrimaryKeyValue) = 1) 


SELECT  PotAcc.DetailID 
FROM  PotentialAccounts PotAcc 
WHERE  PotAcc.DetailID NOT IN (
       SELECT  RecEmail.DetailID 
       FROM  CTE RecEmail 
      ) 
+0

這工作太,非常感謝! –