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 を作成することはできません。SQLインジェクション攻撃を防ぐためにexecを使用したくない。

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 not and で区切る必要があります (例ではWHERE (Name = 'x' ..) AND (Name = 'y'...) 、true と評価されないものがあるため)

上記が当てはまると仮定すると、テーブル値パラメーターを使用できます。最初のステップは、パラメーターを作成することです。

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 に答える