如何获取动态SQL中小于或大于的行



我有一个动态SQL,它有一个关于人的信息,例如

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

现在我怎么能得到所有的人他们的Age < 40 or Age >= 30 or Age <= 50等。我要做的是传递"<30"或">40"等参数并相应地查询。

假设您使用的是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)

我很好奇的一件事是,你是自己编写脚本还是让一个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

最新更新