2015-09-07 32 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 
相關問題