基于MS SQLServer的全表搜索

最近在做项目的时候遇到一个问题,就是在查找记录的时候输入关键字找出满足条件的记录。一开始是每一个字段一个关键字,后面感觉有的查找的时候会涉及到6个甚至更多的字段,感觉在查找的时候相当困难。网上找了很久,想找到一种能够不需要指定字段就可以全表搜索的方法,可惜一直没找到,最后找到一个折中的办法:在每一个表中定义一个字段,这个字段存储其他所有字段的和,然后查找的时候就只要匹配这个字段就行了。

下面是实现思路:

因为在每条数据插入和修改的时候需要往这个字段中插入值或者是更新这个字段,而如果靠代码来控制的话会非常麻烦:你必须时时刻刻记得在哪里插入数据了,又在哪里修改了数据。最后想到了触发器,直接在数据库中建立一个触发器。

触发器语句如下:

Create 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,'')

这样原本以为已经大功告成了,最后测试的时候发现,只要插入一条数据,或者表中的某个字段的值发生改变,所有的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字段的)搜索了,感觉虽然不是什么完美的解决方案,但是毕竟还是比较理想的实现了想要的效果。不知道各位有没有更好的解决办法,或者说有没有第三方的组件来实现全表关键字搜索或者更牛的多表联合关键字搜索呢?

如果有的话,各位不要吝啬哦,小弟这厢有礼了...

posted @ 2013-03-14 21:44  wadeflash  阅读(1588)  评论(15编辑  收藏  举报