一列上的TSQL动态过滤器

时间:2013-02-12 17:35:39

标签: sql sql-server variables dynamic parameters

要查询的表格包含以下列:

(name varchar(50),values varchar(50),description varchar(50)). 

用户希望为每个名称选择多个名称和一系列值,例如:

select * 
from table 
where (name = X and value >=1 and value <= 5 ) 
    AND (name = Y and value >=10 and value <= 25 )
    AND etc for up to 20 factors. 

我不能使用sp_execute sql来编写Dynamic sql,因为名称参数的数量会有所不同。我想使用exec来避免sql注入攻击。

1 个答案:

答案 0 :(得分:2)

我在这里做了4个假设:

  1. 您有SQL-Server 2008或更高版本(标记只是sql-server)
  2. 您的条件始终采用name = Y and value >=10 and value <= 25
  3. 格式
  4. 您的值列实际上是一个int列(基于您的位置 子句)
  5. 你的单独标准应该用OR而不是和(因为in 你的例子WHERE (Name = 'x' ..) AND (Name = 'y'...) 永远不会评估为真)
  6. 假设上述情况属实,那么您可以使用表值参数。第一步是创建参数:

    CREATE TYPE dbo.TableFilter AS TABLE 
    (   Name        VARCHAR(50), 
        LowerValue  INT, 
        UpperValue  INT
    );
    

    然后,您可以创建一个过程来获取过滤结果

    CREATE PROCEDURE dbo.CustomTableFilter @Filter dbo.TableFilter READONLY
    AS
        SELECT  T.*
        FROM    T
        WHERE   EXISTS
                (   SELECT  1
                    FROM    @Filter f
                    WHERE   T.Name = f.Name
                    AND     T.Value >= f.LowerValue 
                    AND     T.Value <= f.UpperValue
                )
    

    然后您可以使用以下内容调用您的程序:

    DECLARE @Filter dbo.TableFilter;
    INSERT @Filter VALUES ('X', 1, 5), ('Y', 10, 25);
    
    EXECUTE dbo.CustomTableFilter @Filter;
    

    <强> Example on SQL Fiddle