我正在运行SQL Server并且有一个存储过程。我想使用WHERE IN子句进行select语句。我不知道列表的长度,因此现在我尝试了以下内容:
SELECT * FROM table1 WHERE id IN (@idList)
在这个解决方案中,@idList是一个VarChar(max)类型的变量。但是这种方法不起作用。我听说可以传递表格值,但是我对如何做到这一点感到困惑。希望能得到任何帮助。
我正在运行SQL Server并且有一个存储过程。我想使用WHERE IN子句进行select语句。我不知道列表的长度,因此现在我尝试了以下内容:
SELECT * FROM table1 WHERE id IN (@idList)
在这个解决方案中,@idList是一个VarChar(max)类型的变量。但是这种方法不起作用。我听说可以传递表格值,但是我对如何做到这一点感到困惑。希望能得到任何帮助。
select * into #ids from dbo.Split(',', @idList)
select t.*
from table1 t
join #ids i
on t.id = i.s
Create function [ReturnValues]
(
@Values nvarchar(4000)
)
Returns @ValueTable table(Value nvarchar(2000))
As
Begin
Declare @Start int
Declare @End int
Set @Start = 1
Set @End = 1
While @Start <= len(@Values)
Begin
Set @End = charindex(',', @Values, @Start)
If @End = 0
Set @End = len(@Values) + 1
Insert into @ValueTable
Select rtrim(ltrim(substring(@Values, @Start, @End - @Start)))
Set @Start = @End + 1
End
Return
End
GO
如您所建议的绑定@idList参数在SQL中不可行。
最好将ID批量插入一个单独的表中,然后通过使用子查询或连接这些ID来查询该表。
例如:
INSERT INTO idTable (id, context) values (@idValue, 1);
INSERT INTO idTable (id, context) values (@idValue, 1);
INSERT INTO idTable (id, context) values (@idValue, 1); // as often as you like
SELECT * FROM table1, idTable WHERE table1.id == idTable.id and idTable.context = 1
上下文必须是一个唯一的值,用于标识ID范围。这对于并行运行存储过程非常重要。如果没有上下文信息,同时运行存储过程会混合来自不同选择的值。
如果参数数量相当小(<100),则可以使用多个参数。
SELECT * FROM table1 WHERE IN id IN (@id1, @id2, @id3)