我有一个动态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