我正在开发一个查询/存储过程,为简单起见,简单地说“Select * from table
”我即将更改为select * from table where location=@location
。
然而,在说这个时我可能要经过多个地方。我不一定要创建30个@location变量并说出location =@location1 and location=@location2
等等。所以我选择做的是,
SELECT *
FROM
TABLE
WHERE
LOCATION
IN (SELECT location FROM locationtable)
然而,再次,“位置表”包含了每一个位置。 (比如位置表有位置A,B和C)我如何编辑这个以说选择*其中位置是A& B(记住A& B作为参数传入)
我想知道是否有一种方法可以在我的存储过程中完成类似的事情来做我所说的。
谢谢
答案 0 :(得分:0)
创建一个将列表拆分为表格的函数。我将结果包装在公用表表达式(CTE)中,然后加入到该CTE中。将大型列表从in语句转换为表以进行连接具有性能优势。
功能:
功能执行示例:从dbo.fn_SplitListToTable中选择*('一,二,三',',')
CREATE FUNCTION [dbo].[fn_SplitListToTable]
(
-- Add the parameters for the function here
@list nvarchar(max)
,@delimiter char(1)
)
RETURNS @table TABLE
(
value nvarchar(max)
)
AS
BEGIN
declare @value nvarchar(max)
while CHARINDEX(',', @list) > 0
begin
select
@value = SUBSTRING(@list, 1, CHARINDEX(',', @list) - 1)
,@list = SUBSTRING(@list, CHARINDEX(',', @list) + 1, LEN(@list) - CHARINDEX(',', @list))
insert into @table select @value
end
insert into @table select @list
RETURN
END
伪存储过程示例:
CREATE PROCEDURE [dbo].[prc_rpt_SplitListToTable]
@List varchar(max)
AS
BEGIN
--Parameter Sniffing
Declare @ListLocal varchar(max) = @List;
--Function to split list into table for multiple criterion selection
with CreateTableFromList as
(
select value as ListItem from [dbo].[fn_SplitListToTable](@ListLocal, ',')
)
Select * from SourceTable st
inner join CreateTableFromList tbl --CTE that now contains a table of values instead of list
on st.value = tbl.value
END