我有一个动态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”等作为参数传递并相应地进行查询。
答案 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