0

要查询的表具有以下列:

(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 来编写动态 sql,因为名称参数的数量会有所不同。我想避免使用 exec 来防止 sql 注入攻击。

4

1 回答 1

2

我在这里做了4个假设:

  1. 您有 SQL-Server 2008 或更高版本(标记仅为 sql-server)
  2. 您的标准将始终采用格式name = Y and value >=10 and value <= 25
  3. 您的 values 列实际上是一个 int 列(基于您的 where 子句)
  4. 您的单独标准应该由 OR 分隔并且(因为在您的示例中,您拥有WHERE (Name = 'x' ..) AND (Name = 'y'...) 的永远不会评估为真)

假设上述情况属实,那么您可以使用表值参数。第一步是创建您的参数:

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;

SQL Fiddle 示例

于 2013-02-12T18:08:46.877 回答