【问题标题】:Dynamic conditions in WHERE clauseWHERE 子句中的动态条件
【发布时间】:2011-10-20 04:50:59
【问题描述】:

我有一个存储过程,想知道是否可以基于参数建立动态where 条件。

假设我有这个查询:

SELECT *
FROM tbl_Users

现在,我有一个名为@username 的参数,我想用它来建立一个动态的where 条件(通过我的程序可能是1 个或多个条件)。为了达到类似的效果,我使用以下语句:

SELECT *
FROM tbl_Users
@username -- where this parameter might hold a condition string such as "Where usr_Username = 5 and usr_first_name like '%Frank%' etc

有可能做这样的事情吗?

【问题讨论】:

  • 不在 T-SQL 本身;您可以使用前端语言(C#、VB.NET 或其他语言)构建该 SELECT 语句,并在完成后将其发送到 SQL Server,或者您可以在 T-SQL 语句中使用动态 SQL 将查询构建为字符串,然后“执行”那个字符串——但你不能像这样“参数化”你的 T-SQL 查询的一部分....
  • 您可以通过字符串构建来做到这一点(就像下面的几个人所展示的那样),但请注意——如果你有任何选择,请避免使用动态 sql——这在很大程度上是一个编写、维护、升级、故障排除等令人头疼。

标签: tsql dynamic conditional-statements where


【解决方案1】:

您真的应该将 SQL 关键字和参数连接到一个字符串中,如上面的一些响应中所示,因为打开了 SQL 注入的大门 (其中一位贡献者实际上已将其称为。这是一个明智的警告!)。

相反,您应该参数化您的 SQL 并执行系统 ​​SP sp_executesql

StackOverflow posting 中显示了一个非常好的代码示例。

【讨论】:

    【解决方案2】:

    我不确定我是否理解您,但如果我的理解正确,您可以执行以下操作(注意:注入易受攻击)

    DECLARE @SQL varchar(500) = 'SELECT * FROM tbl_users ' + @username
    
    EXEC @SQL
    

    【讨论】:

      【解决方案3】:

      你将不得不为此闯入动态 sql。

      它会像这样运行:

      declare @sql varchar(max)
      
      set @sql = '
          SELECT *
          FROM tbl_Users
          WHERE ' + @username
      
      exec (@sql)
      

      【讨论】:

        【解决方案4】:

        据我所知,这是行不通的。您将需要生成要执行的脚本并使用 exec 命令。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-11
          • 1970-01-01
          • 2021-10-28
          • 1970-01-01
          • 2021-10-20
          • 2012-03-01
          • 2010-10-25
          • 1970-01-01
          相关资源
          最近更新 更多