要查询的表格包含以下列:
(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注入攻击。
答案 0 :(得分:2)
我在这里做了4个假设:
name = Y and value >=10 and value <= 25
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;
<强> Example on SQL Fiddle 强>