4

I have a CheckBoxList where users can select multiple items from the list. I then need to be able to pass these values to my Stored Procedure so they can be used in a WHERE condition like:

WHERE ID IN (1,2,3)

I tried doing this so that its a nvarchar parameter and i pass the string 1,2,3 with:

WHERE ID IN (@IDs)

But this returned the following error:

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

Any help would be much appreciated!

1

3 Answers 3

11

There's a few ways of doing it. You could pass in the parameter as an XML blob like this example:

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>'

Or pass in the values as CSV and use a split function to split the values out into a table variable (there's a lot of split functions out there, quick search will throw one up).

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'

If you were using SQL 2008 or later, you could have used Table Valued Parameters which allow you to pass a TABLE variable in as a parameter. I blogged about these 3 approaches a while back, with a quick performance comparison.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for this. I used a WHERE IN (SELECT [values from XML]) clause to get results but never would've known this was possible previously. Cheers!
@Curt how to use the [values from XML]) term in the WHERE IN (SELECT [values from XML]) do you have a specific code? can you help me? sorry im new to this.
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'

Comments

-1

I did find a solution for a similar problem. It is used for a data driven subscription, but can be easily altered for use in a parameter. check my blog post here with a detailed description

If you are having problem converting it to a stored procedure call, just let me know.

11 Comments

Can you expand a little your answer? Near link-only answers are not useful if the link ever goes broken.
Sorry, I was rather late..... I will convert the blogpost into separate replies. For the whole story : the blogpost still works!
It is a rather lengthy blog post and it is still online (and will be for some time)
I have created a very simple table with the name tmpMultiSel with two columns (ID and Name)
Here is what I did to make it ‘multi value’: 1. Create a function I did find a function that accepts two parameters and splits the delimited string (first parameter) into a temporary table. I found it codeproject.com/Articles/7938/… but modified the name to my ‘habits’ _f_ParseText2Table If we test this function, it works like so:
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.