C# SQL查询通配符搜索

C# SQL查询通配符搜索,c#,sql,sql-server,tsql,C#,Sql,Sql Server,Tsql,我正在写一个绑定到列表视图的C网页。我的客户希望能够输入能够显示结果的内容或部分内容。例如,他想要一个文本框,他可以在其中输入电话号码、电话号码的一部分、姓名、城市或其他任何东西,然后会有一个SP排序,查找并列出信息。如何在SQL Sp或VS 2010中实现这一点 使用LIKE操作符 SELECT * FROM Table WHERE PhoneNumber LIKE '%value%' OR Name LIKE '%value%' OR City LIKE '%value%' 选择cols

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

使用LIKE操作符

SELECT * FROM Table WHERE PhoneNumber LIKE '%value%' OR Name LIKE '%value%' OR 
City LIKE '%value%'
选择cols 来自tbl WHERE字段,如“%”++@input++“%”

如果要使用一个文本框,其中可能包含多种不同类型的数据,则需要在代码中指定要搜索的数据库表和列以及搜索顺序

例如,您可以编写一个执行以下操作的查询:

首先,在Customer表中搜索 在FirstName和LastName列中 为了一个像书中那样的名字 文本框。请为其选择CustomerID 所有的比赛。 接下来,搜索两个客户 中的表和供应商表 PhoneNumber列,用于电话 与文本框中的数字相似。 选择CustomerID或SupplierID 所有的比赛。如果找到任何结果,请将它们与第一个查询的结果合并。 继续搜索街道 地址和查询其他表。 将新记录添加到结果集,如下所示 你去吧。 查询完所有要搜索的表后,将有一个包含ID的resultset。您需要执行另一系列选择,以获取要向用户显示的信息。如果将客户、供应商和员工等混为一谈,这可能会变得相当复杂。
从中可以看出,为每个搜索条件设置单独的文本框要容易得多。一个文本框表示名字,另一个文本框表示姓氏,第三个文本框表示公司名称。电话号码的单独文本框。如果您混合了客户、供应商、员工等的数据,您应该让用户在下拉列表或复选框中指明要搜索的人员类型,以便您知道要查询哪些表。

正如其他一些人所建议的,使用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

SO名人的杰夫·阿特伍德对此有点欠缺。
这也是值得一读的:

大多数人都找到了解决方案的一部分-使用LIKE操作符

SELECT * FROM Table WHERE PhoneNumber LIKE '%value%' OR Name LIKE '%value%' OR 
City LIKE '%value%'
但我认为问题的另一个方面可以在SQL中解决

创建计算的varcharMAX列。在此字段上启用全文索引。然后,您只需执行如下sql操作:

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

这样,您就不必像打电话或叫名字一样进行搜索。

尝试从同一个SQL查询通配符搜索中搜索stackoverflow…回答了很多类似的问题。零+1因为它有效-1因为您刚刚鼓励对SQL Server编程非常陌生的人编写代码,使自己非常容易受到SQL注入攻击。Doh,busted。输入将是存储过程的参数,而不是应用程序中的变量。编辑以显示这一点。@Rob Levine:您将如何在其中注入SQL?这不是一个动态查询。我遗漏了什么?@Andriy M-已经编辑过了。最初它是一个动态查询,或者至少可以是。joelt对其进行了编辑,将@符号放入其中,以表明这现在是一个参数化查询。您可以通过单击问题下方编辑旁边的链接查看以前的编辑-但您可能已经知道了@Rob从来没有任何迹象表明这应该是动态sql,因为原始答案只是在语法上缺失@。否则,它不会确认字符串连接的任何语言规范。