0

たとえば、人に関する情報を含む動的SQLがあります。

テーブル

ID   Name   Address  Age(int)
1    a       Main     30
2    b       CT       35

次に、すべての PersonAge < 40 or Age >= 30 or Age <= 50などを取得するにはどうすればよいですか。私がやろうとしているのは、「 <30 」または「 >40 」などをパラメーターとして渡し、それに応じてクエリを実行することです。

4

2 に答える 2

1

MSSQLを使用していると仮定すると、EXECを使用してこの間接参照を実現できます。例えば:

DECLARE @age_constraint AS VARCHAR(100) = '<30'
DECLARE @query AS VARCHAR(255)
SET @query = 'SELECT * FROM Table WHERE Age' + @age_constraint
EXEC(@query)

詳細については、 http://msdn.microsoft.com/en-us/library/ms188332.aspxを参照してください。

于 2013-03-12T16:25:20.700 に答える
1

私が興味を持っていることの 1 つは、これを自分でスクリプト化しているのか、それとも UI コンポーネントに実行させているのかということです。後者の主な問題は、たとえばユーザーが「<40」とだけ入力できるようにすると、SQL インジェクションの問題が発生することです。

それを防ぎ、チェックしている列に対してデータ型が適切であることを確認するには、sp_executesql を使用できますが、数値から演算子を分離する必要があります。これらの行に沿った何かが機能するはずです:

    DECLARE @sql NVARCHAR(4000), @parameterlist NVARCHAR(500), @ageParameter INT, @equality NVARCHAR(2)
    SET @ageParameter = 40
    SET @equality = '='

    SET @sql = 
        'SELECT * FROM SomeTable 
        WHERE @equality = ''='' AND Age = @ageParameter
        UNION ALL 
        SELECT * FROM SomeTable 
        WHERE @equality = ''<'' AND Age < @ageParameter
        UNION ALL   
        SELECT * FROM SomeTable 
        WHERE @equality = ''>'' AND Age > @ageParameter 
    '

    SET @parameterlist = '@ageParameter INT, @equality NVARCHAR(2)'
    EXEC sp_executesql @sql, @parameterlist, @ageParameter = @ageParameter, @equality = @equality

sp_executesql の仕組みの詳細: http://msdn.microsoft.com/en-us/library/ms188001(v=sql.100).aspx

于 2013-03-12T17:08:18.763 に答える