2010-11-07 90 views
0

我有這個問題,我將NVARCHAR參數傳遞給存儲過程,並且該表中的該字段類型是INT。鑄造值SQL IN功能

我這樣做是因爲我使用IN函數,例如如果我想發送多個參數,這是通過.NET完成的唯一可行的方法。或不? 由於類型錯誤,SP未得到執行,而且我正在嘗試轉換該值,但出現錯誤。這裏是我正在嘗試: 例子:

@Parameter nvarchar OrderStatusID = ('30, 40') 

(o.OrderStatusID IN (CAST(@OrderStatusID as int)) OR @OrderStatusID IS NULL) 

有沒有辦法單獨投每個值,或者這將是投全價值爲INT的最佳途徑。

回答

1

要做到這一點的最佳方法是將輸入參數轉換爲表,然後在該表上使用in語句。

你可以用一個CTE做例如

WITH CTE (pos, pos_begin, pos_end) AS 
(
    SELECT 0, 1, CHARINDEX(',', @p + ',') 
    UNION ALL 
    SELECT pos + 1, pos_end + 1, CHARINDEX(',', @p + ',', pos_end + 1) 
    FROM CTE 
    WHERE CHARINDEX(',', @p + ',', pos_end + 1) > 0 
), numList as 
(
    SELECT SUBSTRING(@p, pos_begin , pos_end - pos_begin) AS "value" 
    FROM CTE 
) 
SELECT -- whatever you want 
WHERE (o.OrderStatusID IN (SELECT CAST(value AS int) FROM numList)) OR @p is NULL 

還有其他的方法可以做到這一點,在這裏閱讀有關許多其他技術 - 這哪裏是改編自。 http://www.projectdmx.com/tsql/sqlarrays.aspx#Cte

(NB,因爲我適應這個快速從示例頁面我沒有優化它,它是明確的CTE可以變得簡單,從而更快。)

+0

Emtucifor有一個鏈接,表明在測試數千個值時,遞歸CTE幾乎比遊標循環更好。 – 2010-11-07 21:29:26

0
@Parameter nvarchar OrderStatusID = ('30, 40') 

(o.OrderStatusID IN (CAST(@OrderStatusID as int)) OR @OrderStatusID IS NULL) 

我通常做這樣的事情這

SET @OrderStatusId = ','[email protected]+',' 

CharIndex(','+trim(str(o.OrderStatus))+',' , @OrderStatusId) >0 

但這不是非常快,使用函數在WHERE子句會影響性能。