我有一个动态 SQL,其中包含有关此人的信息,例如
桌子
ID Name Address Age(int)
1 a Main 30
2 b CT 35
现在我怎样才能得到所有 Person 他们的Age < 40 or Age >= 30 or Age <= 50
等。我想做的是传递“ <30 ”或“ >40 ”等作为参数并进行相应的查询。
我有一个动态 SQL,其中包含有关此人的信息,例如
桌子
ID Name Address Age(int)
1 a Main 30
2 b CT 35
现在我怎样才能得到所有 Person 他们的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)
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms188332.aspx。
我很好奇的一件事是,您是自己编写脚本,还是让 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