【问题标题】:SQL Query wildcard searchSQL 查询通配符搜索
【发布时间】:2011-07-14 12:23:53
【问题描述】:

我正在编写一个绑定到列表视图的 C# 网页。我的客户希望能够输入可以显示结果的内容或内容的一部分。例如,他想要一个文本框,他可以在其中输入电话号码、电话号码的一部分、姓名、城市或其他任何内容,并且会有一个可以找到然后列出信息的 SP。如何在 SQL Sp 或 VS 2010 中完成此操作?

【问题讨论】:

  • 尝试从同一个“SQL Query 通配符搜索”中搜索 stackoverflow...有很多类似的问题得到解答。

标签: c# sql sql-server tsql


【解决方案1】:

SELECT cols FROM tbl WHERE field LIKE '%' + @input + '%'

【讨论】:

  • 零! +1,因为它有效。 -1 因为你刚刚鼓励了一个对 SQL Server 编程很陌生的人编写的代码让他们自己很容易受到 SQL 注入攻击。
  • 哎呀,破案了。 “输入”将是存储过程的参数,而不是应用程序中的变量。编辑以显示这一点。
  • @Rob Levine:您将如何在其中注入 SQL?这不是动态查询。我错过了什么?
  • @Andriy M - 它已被编辑。最初它是一个动态查询(或者至少可能是)。 joelt 对其进行了编辑,将 @ 符号放入其中,以表明这是一个参数化查询。您可以通过单击问题下方“已编辑”旁边的链接来查看以前的修改 - 但您可能已经知道了!
  • @Rob 从来没有任何暗示这应该是动态 sql,因为原始答案只是在语法上缺少 @。否则它不会确认字符串连接的任何语言规范。
【解决方案2】:

正如其他几个人所建议的,使用 LIKE 运算符。

但是,不要像其他人建议的那样将用户输入的数据直接放入您的 LIKE 子句中。这导致了一个非常简单且非常危险的漏洞,称为 SQL 注入攻击。

如果将用户的输入直接插入

SELECT cols FROM tbl WHERE field LIKE '%' + input + '%'

然后用户可以在文本框中输入以下内容:

;删除表 tbl; --

(例如),这使得你的SQL语句变成:

SELECT cols FROM tbl WHERE field LIKE '%';  (the first part of your query)
DROP TABLE tbl;    (the injected sql that you don't want to let people run; drop the database table)
-- '%'   (the rest of your previous query is commented out)

始终确保您使用了参数化的 SQL 语句,或者至少对您的输入进行了清理。您真的不希望人们能够在您的数据库服务器上运行任意 SQL。

Jeff Atwood(声名狼藉)对此有一个简短的posting。 也值得一读this :)

【讨论】:

    【解决方案3】:

    大多数人都找到了解决方案的一部分——使用 LIKE 运算符。

    但我认为问题的另一个方面可以在 SQL 中解决。

    创建一个计算的 varchar(MAX) 列。在此字段上启用全文索引。然后你需要做的就是做一个像这样的sql:

    SELECT * from <TABLE_NAME> WHERE Keywords like '%<search term>%'
    

    这样你就不必做phone like &lt;search&gt;name like &lt;search&gt;等。

    【讨论】:

      【解决方案4】:

      使用LIKE 运算符。

      SELECT * FROM Table WHERE PhoneNumber LIKE '%value%' OR Name LIKE '%value%' OR 
      City LIKE '%value%'
      

      【讨论】:

        【解决方案5】:

        如果您想使用一个文本框,它可以包含多种不同类型的数据,您需要在代码中具体说明您将搜索哪些数据库表和列以及搜索顺序。

        例如,您可以编写一个这样的查询:

        • 首先,在客户表中搜索 在 FirstName 和 LastName 列中 对于一个名字喜欢的那个 文本框。选择 CustomerID 所有比赛。
        • 接下来,在 Customer 中搜索 表和供应商表,在 PhoneNumber 列,用于电话 数字喜欢文本框中的那个。 选择 CustomerID 或 SupplierID 对于所有的比赛。如果找到任何结果,请将它们与第一个查询的结果结合起来。
        • 继续搜索街道 地址,并查询其他表。
        • 将新记录添加到结果集中 你去吧。
        • 查询完所有要搜索的表后,您将获得一个包含 ID 的结果集。您需要执行另一系列 SELECT 以获取要显示给用户的信息。如果您将客户和供应商(以及员工等)混在一起,这可能会变得相当复杂。

        从这里可以看出,为每个搜索条件设置单独的文本框会容易得多。一个文本框用于名字,另一个用于姓氏,第三个用于公司名称。电话号码的单独文本框。如果您要混合客户、供应商、员工等的数据,您应该让用户指明(可能在下拉列表中或使用复选框)要搜索的人员类型,以便您知道要查询哪些表。

        【讨论】:

          猜你喜欢
          • 2014-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多