2011-01-07 66 views
3

我有一個CheckBoxList,用戶可以從列表中選擇多個項目。然後我需要能夠將這些值傳遞給我的存儲過程,使他們能夠被用在WHERE條件,如:爲一個SQL參數傳遞多個值

WHERE ID IN (1,2,3) 

我試着這樣做,這樣它的一個nvarchar的參數,我把這個字符串1,2,3有:

WHERE ID IN (@IDs) 

但這返回以下錯誤:

Conversion failed when converting the nvarchar value '1,2,3' to data type int 

任何幫助,將不勝感激!

+0

請參閱http://stackoverflow.com/questions/878833/passing-a-varchar-full-of-comma-delimited-values-to-a-sql-server-in-function(或使用位掩碼) – 2011-01-07 10:16:25

回答

11

有幾種方法可以做到這一點。 你可以在參數傳遞作爲XML的blob這樣的例子:

CREATE PROCEDURE [dbo].[uspGetCustomersXML] 
    @CustomerIDs XML 
AS 
BEGIN 
SELECT c.ID, c.Name 
FROM [dbo].[Customer] c 
JOIN @CustomerIDs.nodes('IDList/ID') AS x(Item) ON c.ID = Item.value('.', 'int') 
END 
GO 

--Example Use: 
EXECUTE [dbo].[uspGetCustomersXML] '<IDList><ID>1</ID><ID>10</ID><ID>100</ID></IDList>' 

或者傳中值作爲CSV和使用拆分函數的值進行分成表變量(有很多的分裂功能在那裏,快速搜索會拋出一個)。

CREATE PROCEDURE [dbo].[uspGetCustomersCSV] 
    @CustomerIDs VARCHAR(8000) 
AS 
BEGIN 
SELECT c.Id, c.Name 
FROM [dbo].[Customer] c 
JOIN dbo.fnSplit(@CustomerIDs, ',') t ON c.Id = t.item 
END 
GO 

--Example Use: 
EXECUTE [dbo].[uspGetCustomersCSV] '1,10,100' 

如果您使用SQL 2008或更高版本,你也可以使用表值參數,讓你通過一個表變量作爲參數。 I blogged關於這三種方法的回顧,以及快速的性能比較。

+0

謝謝你。我使用了WHERE IN(SELECT [來自XML的值])子句來獲得結果,但從來不會知道這是可能的。乾杯! – Curt 2011-01-10 14:05:54

+0

@Curt如何使用`[來自XML的值])'WHERE IN'(SELECT [來自XML的值])'有沒有特定的代碼?你可以幫我嗎?對不起,我是新來的。 – user2705620 2013-11-07 02:00:56

1
alter procedure c2 
(@i varchar(5)) 
as 
begin 
    declare @sq nvarchar(4000) 
    set @sq= 'select * from test where id in (<has_i>) ' 
    SET @sq= REPLACE(@sq, '<has_i>', @i) 
    EXECUTE sp_executesql @sq 
end 

exec c2 '1,3'