Search code examples
stored-proceduressql-server-2008-r2parameterized

How to pass string parameter with `IN` operator in stored procedure SQL Server 2008


I have a stored procedure when I execute it I got error

Conversion failed when converting the varchar value '+@dptId+' to data type int

I am getting DepartmentId as a string like (1,3,5,77) and am passing this to my stored procedure.

SQL FIDDLE

create table dummy (id int,name varchar(100),DateJoining Datetime, departmentIt int)

insert into dummy values (1,'John','2012-06-01 09:55:57.257',1);
insert into dummy  values(2,'Amit','2013-06-01 09:55:57.257',2);
insert into dummy  values(3,'Naval','2012-05-01 09:55:57.257',3);
insert into dummy  values(4,'Pamela','2012-06-01 09:55:57.257',4);
insert into dummy  values(5,'Andrea','2012-09-01 09:55:57.257',3);
insert into dummy  values(6,'Vicky','2012-04-01 09:55:57.257',4);
insert into dummy  values(7,'Billa','2012-02-01 09:55:57.257',4);
insert into dummy  values(8,'Reza','2012-04-01 09:55:57.257',3);
insert into dummy  values (9,'Jacob','2011-05-01 09:55:57.257',5);

Query I tried:

declare @startdate1 varchar(100) ='20120201'
declare @enddate1 varchar(100)='20130601'
declare @dptId varchar(100)='3,4'

select * 
from dummy
where DateJoining >= @startdate1 and DateJoining < @enddate1 
  and departmentIt IN (@dptId);

Solution

  • Here's how I solved it: Working SQL Fiddle

    First I have create a function which splits the string value i.e. '1,2,4,5'

    Split function:

    CREATE  FUNCTION fn_Split(@text varchar(8000), @delimiter varchar(20) = ' ')
    RETURNS @Strings TABLE
    (   
      position int IDENTITY PRIMARY KEY,
      value varchar(8000)  
    )
    AS
    BEGIN
    
    DECLARE @index int
    SET @index = -1
    
    WHILE (LEN(@text) > 0)
      BEGIN 
        SET @index = CHARINDEX(@delimiter , @text) 
        IF (@index = 0) AND (LEN(@text) > 0) 
          BEGIN  
            INSERT INTO @Strings VALUES (@text)
              BREAK 
          END 
        IF (@index > 1) 
          BEGIN  
            INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))  
            SET @text = RIGHT(@text, (LEN(@text) - @index)) 
          END 
        ELSE
          SET @text = RIGHT(@text, (LEN(@text) - @index))
        END
      RETURN
    END
    

    Later in my query I use that split function

    declare @startdate1 varchar(100) ='20120201'
    declare @enddate1 varchar(100)='20130601'
    declare @dptId varchar(100)='3,4'
    
    select * from dummy
    where DateJoining >=@startdate1 and DateJoining < @enddate1 
      and departmentID IN (SELECT Value FROM fn_Split(@dptId, ','));