SQL Server7.0存储过程问题!有大分相送!各位大虾请看了。。。(200分)

  • 主题发起人 主题发起人 yuanh23
  • 开始时间 开始时间
Y

yuanh23

Unregistered / Unconfirmed
GUEST, unregistred user!
一个按照某一特定字段查指定表中是否有冗余的存储过程,
@TableName 表名
@FieldName1,@FieldName2 字段名
@FieldContent 字段内容
现在这个存储过程工作正常!,但功能并不完善。如,当输入'厦门远华公司'时,
如库中已有'远华'或'厦门远华',皆可查出结果。但反过来不行。现在要求输入'远华'时
,也可查出'厦门远华'等字段。需要如何实现?工程马上就完了,老板天天在催!
各位大侠,救救我吧!只要能满足要求,一定大分相送!!!
另:如何在使用游标时,也可动态传入表名和字段名???分数另算!
CREATE PROCEDURE prCheckedundance
--从@TableName中查找@FieldName1,@FieldName2字段。
@TableName varchar(20),
@FieldName1 varchar(20),
@FieldName2 varchar(20)=null,
@FieldContent varchar(40)=''
AS
declare @Temp varchar(255)
declare @T1 varchar(255)
declare @T2 varchar(255)
declare @all varchar(255)
begin tran
select @Temp='%'+@FieldContent+'%'
select @T1='select '+@FieldName1+','+@FieldName2+' from '+@TableName
select @T2=' where '+@FieldName1+' like '+char(39)+@Temp+char(39)
select @all=@T1+@T2
--print @all
execute(@all)
if @@error<>0
begin
rollback tran
end
commit tran

 
>>如,当输入'厦门远华公司'时,如库中已有'远华'或'厦门远华',皆可查出结果。
>>但反过来不行。现在要求输入'远华'时,也可查出'厦门远华'等字段。

您是不是说反了???

@FieldContent 字段内容还是您的传入参数?
select @T2=' where '+@FieldName1+' like '+char(39)+@Temp+char(39)
好象能实现 输入'远华'时,可查出'厦门远华'字段。的功能。
 
看完你的存储过程.
他能完成的功能只是能实现 输入'远华'时,可查出'厦门远华'字段。的功能。
我猜想你要实现的功能是:
"当输入'厦门远华公司'时,如库中已有'远华'或'厦门远华',皆可查出结果。"
但是像这种处理,是需要规则的。举例说'厦门远华公司'包括‘公司’、‘厦门’、
‘远华’等等好多种组合。你在没有规则(字符拆分预定)情况下,你的工作是辛苦
而没有价值的!
 
同意colorstone
 
这是我在sina bbs上回答一个类似问题的帖子:应该是你想要的。
主题:这样写试试?
select * from mytb where charindex(rtrim(NAME),'厦门远华公司') >0
但这样有个限制,Name 中如果是'厦门%'就得不到正确结果了。你可以在
'厦门远华公司'前加一个char.'_厦门远华公司'就行了。

(sql server 7.0 and sybase :
The command(s) completed successfully.
)
如果name字段有'厦门'或者'厦门XX'应该都能查出来。
不过这样的效率太低。肯定会慢的。8-(
 
Wumeng兄:你说的对,我的确是说反了!@fieldcontent是传入参数。即在表@tablename中查找是
否有可能相同的记录,@fieldname2是用来多返回一个字段的。比如人名有可能相同,但返回姓名和地址,
用户一般就可以确定是否相同。
to colorstone:>>但是像这种处理,是需要规则的。举例说'厦门远华公司'包括‘公司’、‘厦门’、
‘远华’等等好多种组合。你在没有规则(字符拆分预定)情况下,你的工作是辛苦
而没有价值的!
我举的例子是在用户输入单位名称时用的,因此用户不可能只输入公司’、‘厦门’等。而且我也
没办法确定规则。不知colorstone有何高见?
三代坦克兄:你的方法很好。但很抱歉,我是想在用户输入单位名称时做到精确判断。
即exec prcheckedundance'mytable','myfield1','my field2','厦门远华公司'时,如库中已有
远华’,则可返回值。不知要如何实现?????至于效率的问题,我已设定一逻辑开关,
如用户嫌慢,可以将此功能关掉。
 
哈哈,输入‘厦门远华公司’想查出含有‘远华’的字段?只含有‘远’或只含有‘华’的
查不查?你怎么知道要把‘厦门远华公司’只拆成‘厦门’、‘远华’两个子串?‘门远’
查不查?
如果坚持这样做,只能象下面一样:
Select ...
Where Name Like '%厦%' or
Name Like '%门%' or
Name Like '%远%' or
Name Like '%华%' or
Name Like '%公%' or
Name Like '%司'
因为你不知道应该怎样分词。
 
各位抱歉!刚才没仔细看,三代坦克兄的回帖恰恰是我想要的,知识还有一点小问题,
>>但这样有个限制,Name 中如果是'厦门%'就得不到正确结果了。你可以在
'厦门远华公司'前加一个char.'_厦门远华公司'就行了。加char.'_厦门远华公司'是为什么呢?
我现在就是时看,如果可以的话,马上加分!!!
另外,:如何在使用游标时,也可动态传入表名和字段名???分数另算!有谁知道该怎么做呢?
 
》》Name 中如果是'厦门%'就得不到正确结果了
加一个字符(任意,不一定是_)目的是使charindex()的返回值正确。
例如:name=‘厦门’
charindex(rtrim(NAME),'厦门远华公司') = 0 而我们的条件是
where charindex(rtrim(NAME),'厦门远华公司') >0

所以加个前导字符比如~,name = ~ + name;
where charindex(rtrim(NAME),'厦门远华公司') >0
这样就行了,当然你要保证你的前导字符不在你的'厦门远华公司'的表达式中出现。
反面例子:name = '厦门'加了前导。name =~厦门。
要查的字符串是“~厦门~公司”这样charindex就返回 0,自然就不对了。

第二个问题好像是可以,我在TSQL书中见过。有点印象,忘了,抱歉,不能帮你了。

 
charindex 函数不是所有数据库引擎都支持啊。
 
如果一定要象你说的那样:
建立这样的规则是可行的:
step1。把厦门等地名前缀、公司等后缀入库(不会很多,可应一时之急,以后慢慢加)
step2。检查用户输入的字符串,去掉前后缀(字符串操作,不会很难)。
step3.运行你的存储过程。
 
各位!我刚刚试过三代坦克兄的办法,的确是可行的!另外几位说的也有道理。这里谢过了。
分已送出,请查收!
 
多人接受答案了。
 
补充一下:
我觉得SQL Server应该有相应的函数实现这个功能,
肯定比charindex快。可惜找不到。呜呜.
 
后退
顶部