2015-09-07 50 views
0

如果您有两个表Employee和Department。使用具有多个值的IN子句的SQL存储过程

  • tblEmp - 的EmpID,EmpName,DEPTID是场
  • tblDepartment - DEPTID,DEPTNAME是场

员工和部门表有外键关系。

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),我将会动态地通过它们。

+0

我不知道有什么方法除了将多个值作为单个分隔字符串传递并在SQL代码中进行分解以外。 – jmcilhinney

+1

@jmcilhinney - 还有其他的选择,但它们都是*(imo)*也很笨重。例如,表值参数? – MatBailie

回答

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

你应该把这个'split'的代码也写出来,以便作出完整的回答。 – Alejandro

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 
相关问题