基于MS SQLServer的全表搜索

2014-11-24 13:28:57 · 作者: · 浏览: 0
基于MS SQLServer的全表搜索
最近在做项目的时候遇到一个问题,就是在查找记录的时候输入关键字
找出满足条件的记录。一开始是每一个字段一个关键字,后面感觉有的
查找的时候会涉及到6个甚至更多的字段,感觉在查找的时候相当困难。
网上找了很久,想找到一种能够不需要指定字段就可以全表搜索的方
法,可惜一直没找到,最后找到一个折中的办法:在每一个表中定义一个
字段,这个字段存储其他所有字段的和,然后查找的时候就只要匹配
这个字段就行了。
www.2cto.com
下面是实现思路:
因为在每条数据插入和修改的时候需要往这个字段中插入值或者是更新这
个字段,而如果靠代码来控制的话会非常麻烦:你必须时时刻刻记得在哪里
插入数据了,又在哪里修改了数据。最后想到了触发器,直接在 数据库
建立一个触发器。
触发器语句如下:
Create trigger [GECOAssets_Trigger]
on [dbo].[GECOAssets] for
insert,update
as
Update GECOAssets Set
SumText=isnull(SourceID,'') +'∩'+isnull(SourceName,'')+'∩'+isnull
(StateNow,'')+'∩'+isnull(BuyD
epartment,'')+'∩'+isnull(Factory,'')
+'∩'+isnull(SourceType,'')+'∩'+isnull(BackInfo,'')
这样原本以为已经大功告成了,最后测试的时候发现,只要插入一条数
据,或者表中的某个字段的值发生改变,所有的SumText的值都会被重新更
新或者插入,当数据量很大的时候或者数据更新插入很频繁的时候,势必给
数据库造成很大的压力。
这时我突然想起了当初学Orace的时候老师讲过的行级触发器,于是百度、
谷歌找了很久,最后得出的结论是:MS SQLServer不支持行级触发器。这
下让我很受打击啊,毕竟自己觉得还不错的方法就这样被终结了,心情极度
郁闷。不过,不抛弃不放弃是我的座右铭,于是死磕继续百度、谷歌,最后
发现,在插入和更新数据的时候,会有一个表叫做inserted,而这个表会存储
你更新时候的数据,这样,我灵光一闪:那这个表中肯定就会存储这条记录
的ID值,只要能取到ID的值,想必就可以指定更新某一条记录了,也就可
以实现行级触发器的效果了,我抱着试试看的心态把触发器改成了如下:
Alter trigger [GECOAssets_Trigger]
on [dbo].[GECOAssets] for
insert,update
as
Update GECOAssets Set
SumText=isnull(SourceID,'') +'∩'+isnull(SourceName,'')+'∩'+
isnull(StateNow,'')+'∩'+isnull
(BuyDepartment,'')+'∩'+isnull(Factory,'')
+'∩'+isnull(SourceType,'')+'∩'+isnull(BackInfo,'') where ID in
(select ID from inserted)
果不其然,完美地实现了行级触发器的效果,至此就可以全表不指
定字段(当然还是需要指定SumText字段的)搜索了,感觉虽然不是什
么完美的解决方案,但是毕竟还是比较理想的实现了想要的效果。