基于传入的多个参数进行查询

时间:2014-07-29 15:13:15

标签: sql tsql

我正在开发一个查询/存储过程,为简单起见,简单地说“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作为参数传入)

我想知道是否有一种方法可以在我的存储过程中完成类似的事情来做我所说的。

谢谢

1 个答案:

答案 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