如果您有两个表Employee和Department。
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)我将动态传递它们。
答案 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