1

现在我有一个很长的查询,我想用这样的语句来代替

where userid=@userid

但是我还有其他改变流程的参数,所以,我想要两个选项,选择一个用户或任何用户

我可以发送用户名以便它可以选择和用户吗?就像我们在 LIKE 语句中所做的那样,我们发送

where username LIKE "%%"

我们得到了所有记录,我怎样才能用 INT 做到这一点?

因为我的查询是参数化的,所以我不能像这样添加“OR 1=1”

where userid=1 or 1=1

我应该使用 BETWEEN 并获取两个参数,所以当我选择一条记录时,我将输入 userid-1 和 userid+1 作为两个参数,并获取一个用户,当我想要全选时,我将输入 1 和百万。

它是参数化查询的一种合乎逻辑的方式,还是有另一种方式,只有一个参数?

解决方案 这就是我使用解决方案的方式,当您使用右侧的 or 列时,您的 sql 将被破坏。

4

4 回答 4

10

通常这是使用

WHERE userid = @userid OR @userid IS NULL

另一种变体(如果 userid 列不可为空):

WHERE userid = COALESCE(@userid, userid)

还有一个(对于整数)是说

WHERE userid BETWEEN COALESCE(@userid, 1)
    AND COALESCE(@userid, 2000000000); -- well, 2147whatever

但是,如果您有很多这些条件,并且每次运行查询时参数都会更改,那么您可能会将自己锁定在并不总是合适的糟糕计划中。所以有时答案是生成动态SQL:

SET @sql = @sql + CASE WHEN @userid IS NOT NULL THEN 
    N' AND userid = ' + CONVERT(VARCHAR(12), @userid);

将此与OPTION RECOMPILE和/或实例设置“针对临时工作负载进行优化”相结合,您只会在计划缓存中填充多次执行的查询版本的计划。

于 2012-06-15T17:44:05.103 回答
2

以下内容会起作用吗?

SELECT * FROM Users WHERE UserID = @UserID OR @SelectAllUsers = 1

您将 @SelectAllUsers 设置为可以作为 1 或任何其他数字传递的整数。如果为1,则选择所有用户,否则只选择传入的用户。

于 2012-06-15T17:46:05.310 回答
1
where userId > -1

那行得通吗?

于 2012-06-15T17:44:06.810 回答
0

参数化查询可以防止发生 sql 注入。你为什么不做一个没有参数或 WHERE 子句的特定查询SELECT * FROM users

于 2012-06-15T17:43:55.043 回答