如何获得小于或大于动态SQL的行?

时间:2013-03-12 16:11:34

标签: sql-server-2008

我有一个动态SQL,其中包含有关此人的信息,例如

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

现在我如何才能让所有人获得Age < 40 or Age >= 30 or Age <= 50等等。我要做的是将“&lt; 30”或“&gt; 40”等作为参数传递并相应地进行查询。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我很好奇的一件事是你是自己编写脚本还是你有一个UI组件来做这件事。后者的主要问题是,如果允许用户仅输入“&lt; 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