使用带有多个值的IN子句的SQL存储过程

时间:2015-09-07 11:45:11

标签: sql sql-server

如果您有两个表Employee和Department。

  • tblEmp - EmpID,EmpName,DeptID是字段
  • tblDepartment - DeptID,DeptName是字段

Employee和Department表具有外键关系。

SELECT * FROM tblEmp e
INNER JOIN tblDepartment d on d.DeptID = e.DeptID
WHERE d.DeptID IN ('1','2') 

如何为上述语句编写存储过程? where子句IN语句中的部门id值是动态的(1,2)或(1,2,3)我将动态传递它们。

2 个答案:

答案 0 :(得分:4)

您可以传递单个varchar(max)对象中的所有值。

然后在你的sp中,你可以使用split函数拆分你的值,然后在其上加上'IN'子句。

Create procedure sp_test
@var1 nvarchar(max)
as
begin
    select * from tblEmp e
    Inner join tblDepartment d on d.DeptID = e.DeptID
    where d.DeptID IN select value from dbo.split(@var1))
end

答案 1 :(得分:1)

创建一个函数来分割逗号分隔值,如下所示

CREATE FUNCTION [dbo].[FnSplit]
(
@List nvarchar(2000),
@SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
Id int identity(1,1),
Value nvarchar(100)
) 
AS  
BEGIN
   While (Charindex(@SplitOn,@List)>0)
   Begin 
       Insert Into @RtnValue (value)
       Select
       Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
       Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
   End 

   Insert Into @RtnValue (Value)
   Select Value = ltrim(rtrim(@List))
   Return
END

在您的存储过程中调用以下函数,

CREATE PROCEDURE usp_getvalues
@var1 nvarchar(max)
AS
BEGIN
    SET NOCOUNT ON;
    SELECT * FROM tblEmp e
    INNER JOIN tblDepartment d 
    on d.DeptID = e.DeptID
    WHERE d.DeptID IN (SELECT value FROM [dbo].[FnSplit](@var1))

    SET NOCOUNT OFF;
END