我可以用参数规避where子句而不是在查询中添加OR 1 = 1吗?

Uğu*_*han 1 sql t-sql sql-server ado.net

现在我有一个很长的查询,我想替换这样的声明

where userid=@userid
Run Code Online (Sandbox Code Playgroud)

但我有其他参数可以改变流量,因此,我想有两个选项,选择一个用户或任何用户

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

where username LIKE "%%"
Run Code Online (Sandbox Code Playgroud)

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

因为我的查询是参数化的,所以我不能添加"OR 1 = 1"之类的

where userid=1 or 1=1
Run Code Online (Sandbox Code Playgroud)

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

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

这就是我使用该解决方案的方法,当您使用右侧的或者列时,您的sql将被破坏.

Aar*_*and 10

通常这是使用

WHERE userid = @userid OR @userid IS NULL
Run Code Online (Sandbox Code Playgroud)

另一种变体(如果用户标识列不可为空):

WHERE userid = COALESCE(@userid, userid)
Run Code Online (Sandbox Code Playgroud)

另一个(对于整体)就是说

WHERE userid BETWEEN COALESCE(@userid, 1)
    AND COALESCE(@userid, 2000000000); -- well, 2147whatever
Run Code Online (Sandbox Code Playgroud)

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

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

结合使用OPTION RECOMPILE和/或实例设置"针对临时工作负载进行优化",您只需填写计划缓存,并计划多次执行的查询版本.