ASP.NET利用存储过程实现模糊查询的心得

 

这个问题的提出似乎没有什么太大的意义,至少我开始是这么想的,因为这个功能无非是在存储过程中使用sql语句的LIKE就可以实现模糊查询。今天与同学无意之中谈到了这个问题,他说他做过测试是不正确的,我对此也非常好奇,我大致把存储过程的语句写下来好作测试。

 

在MSSQL中的Northwindsql中为employess表新建存储过程(作用按LastName进行模糊查询),为什么这样写后面会讲到:

 

CREATE PROCEDURE Employess_Sel @lastname char(10)

 

AS

 

select lastname from Employees where lastname like /"%/" + @lastname + /"%/"

 

GO

 

上面这条语句是一般人的思路,而且这也是无可非异的(并且我使用了两种情况,另一种情况是将前后两个%加到@lastname变量里面来进行测试),使用
SQL查询分析器进行操作,输入"e"(不要双引号)查出来是没有结果的,但是实际上使用SQL语句得出的结果有三条记录,分别是:Fuller,
Leverling,Peacock。为什么会出现这种情况?我们查了一下SQL的帮助文档得到这样的信息(其中引用了部分SQL帮助文档的部分内容):

 

当使用 LIKE 进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比较要返回包含"abc "(abc
后有一个空格)的所有行,则将不会返回包含"abc"(abc
后没有空格)的列所在行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc
后没有空格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

 

由于数据存储方式的原因,使用包含 char 和 varchar 数据模式的字符串比较可能无法通过 LIKE 比较。了解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分重要。

 

下面的示例将局部 char 变量传递给存储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递,这种情况就是我上面讲到的失败情况。

 

CREATE PROCEDURE find_books @AU_LNAME char(20)

 

AS

 

SELECT @AU_LNAME = RTRIM(@AU_LNAME) + /"%/"

 

SELECT t.title_id, t.title

 

FROM authors a, titleauthor ta, titles t

 

WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id

 

AND a.au_lname LIKE @AU_LNAME

 

当名字中包含的字符数小于 20 时,char 变量 (@AU_LNAME) 将包含尾随空格,这导致 find_books
过程中没有行返回。由于 au_lname 列为 varchar 类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过程失败。

 

但下面的示例是成功的,因为尾随空格没有被添加到 varchar 变量中:

 

USE pubs

 

GO

 

CREATE PROCEDURE find_books2 @au_lname varchar(20)

 

AS

 

SELECT t.title_id, t.title

 

FROM authors a, titleauthor ta, titles t

 

WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id

 

AND a.au_lname LIKE @au_lname + /"%/"

 

EXEC find_books2 /"ring/"

 

下面是结果集:

 

title_id title

 

-------- ---------------------------------------------------------------

 

MC3021 The Gourmet Microwave

 

PS2091 Is Anger the Enemy?

 

PS2091 Is Anger the Enemy?

 

PS2106 Life Without Fear

 

(4 row(s) affected)

 

下面我总结一下刚才所讲的内容,上面所遇到的情况是许多人都容易遇到的,为什么我在写第一个存储过程的时候使用char(10),是因为在使用SQL设计
数据表的时候默认是10个字节并且是无法修改的,从而在输入字符时不够4个字节的话就很容易造成尾随空格的出现。所以在设计数据表的时候尤其要注意这些情
况的发生,另外我要说的是遇到问题并不可怕,要不断的查资料,最好是比较权威一点的,比如微软的VS.NET帮助文档,以及其它微软提供的帮助文档,再者
是治学要严谨,多和别人交流,也许别人帮不了你,但是你在描述问题的时候同时也在思考问题,从而给你提出一点有用的意见,对你有所启发。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值