Declare @Content varChar(500),@Nk VarChar(50), @Crb varChar(50),@Bd varChar(50),@Gm varChar(50) Select @Content=Content From jbxx Set @Nk=SubString(@Content,Charindex(':',@Content), @Content,Charindex('<BR>',@Content)) Set @Content=STUFF(@Content,Charindex(':',@Content), @Content,Charindex('<BR>',@Content)) Set @Crb=SubString(@Content,Charindex(':',@Content), @Content,Charindex('<BR>',@Content)) Set @Content=STUFF(@Content,Charindex(':',@Content), @Content,Charindex('<BR>',@Content)) Set @Bd=SubString(@Content,Charindex(':',@Content), @Content,Charindex('<BR>',@Content)) Set @Content=STUFF(@Content,Charindex(':',@Content), @Content,Charindex('<BR>',@Content)) Set @Gm=SubString(@Content,Charindex(':',@Content), @Content,Charindex('<BR>',@Content)) print @Nk+@crb+@bd+@Gm
try: --创建字符串替换函数 create function fgetstr(@str varchar(1000)) returns varchar(1000) as begin set @str=replace(@str,'<BR>分科类名:',',') set @str=replace(@str,'<BR>病名:',',') set @str=replace(@str,'<BR>症状名:',',') set @str=replace(@str,'<BR>症状概述:','') set @str=left(@str,len(@str)-patindex('%<BR>%<BR><BR>',@str)-1) return (@str) end go--测试 select dbo.fgetstr('内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>')--在查询中使用 select dbo.fgetstr(content) from jbxx--删除函数 drop function fgetstr
没注意到,content中有'总科类名:'这几个字,函数要改一下: --创建字符串替换函数 create function fgetstr(@str varchar(1000)) returns varchar(1000) as begin set @str=right(@str,len(@str)-5) --去掉'总科类名:'这几个字 set @str=replace(@str,'<BR>分科类名:',',') set @str=replace(@str,'<BR>病名:',',') set @str=replace(@str,'<BR>症状名:',',') set @str=replace(@str,'<BR>症状概述:','') set @str=left(@str,len(@str)-patindex('%<BR>%<BR><BR>',@str)-1) return (@str) end
zjcxc(邹建): 提示错误信息: 在关键字 'select' 附近有语法错误。
没错啊,我测试的结果正常: --try: --创建字符串替换函数 create function fgetstr(@str varchar(1000)) returns varchar(1000) as begin set @str=right(@str,len(@str)-5) --去掉'总科类名:'这几个字 set @str=replace(@str,'<BR>分科类名:',',') set @str=replace(@str,'<BR>病名:',',') set @str=replace(@str,'<BR>症状名:',',') set @str=replace(@str,'<BR>症状概述:','') set @str=left(@str,len(@str)-patindex('%<BR>%<BR><BR>',@str)-1) return (@str) endgo--测试 select dbo.fgetstr('总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>')--在查询中使用 --创建测试表 create table jb(content varchar(200)) insert into jb values('总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>') select dbo.fgetstr(content) from jb--删除函数 drop function fgetstr drop table jb
--如果排除了上面不符合规范的地方,你可以写这样的函数 --参数@str为整个字符,参数@name为类别名,返回指定类别的值 create function fgetstr(@str varchar(1000),@name varchar(100)) returns varchar(1000) as begin declare @i1 int,@i2 int select @str='<BR>'+@str+'<BR>',@name='<BR>'+@name+':' set @i1=charindex(@name,@str) set @i2=charindex('<BR>',@str,@i1+1)-@i1 set @str=substring(@str,@i1,@i2) set @str=right(@str,@i2-len(@name)) lbexit: return (@str) endgo--测试 select dbo.fgetstr('总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>','总科类名') select dbo.fgetstr('总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>','病名') go--删除自定义函数,在你的程序中不要执行这一句,删除了函数以后就不能用了. drop function fgetstr
不知道: 我把select dbo.fgetstr(content) from binli套到我那用时,就不行了,不能把字段当参数传递了。是什么意思?你在你的程序中是怎么样用的.
----我把select dbo.fgetstr(content) from binli套到我那用时,就不行了,不能把字段当参数传递了。---- 真不好意思,这是我的一个疏忽,当时binli表中的content字段中含有空值,空值传过去当然会出错了。把空值过滤掉就没问题了。
数据库一开始并不是我设计的,设计这的人已经走掉了。剩余的工作要我接着做,真是太烦了。要改变库结构,时间紧啊!来不及了。所以请各位看看能否实现。
谢谢!
@Crb varChar(50),@Bd varChar(50),@Gm varChar(50)
Select @Content=Content From jbxx
Set @Nk=SubString(@Content,Charindex(':',@Content),
@Content,Charindex('<BR>',@Content))
Set @Content=STUFF(@Content,Charindex(':',@Content),
@Content,Charindex('<BR>',@Content))
Set @Crb=SubString(@Content,Charindex(':',@Content),
@Content,Charindex('<BR>',@Content))
Set @Content=STUFF(@Content,Charindex(':',@Content),
@Content,Charindex('<BR>',@Content))
Set @Bd=SubString(@Content,Charindex(':',@Content),
@Content,Charindex('<BR>',@Content))
Set @Content=STUFF(@Content,Charindex(':',@Content),
@Content,Charindex('<BR>',@Content))
Set @Gm=SubString(@Content,Charindex(':',@Content),
@Content,Charindex('<BR>',@Content))
print @Nk+@crb+@bd+@Gm
jbxx是表名,其中包含content字段用Copy(S; Index, Count: Integer) 好象不行吧!因为content字段是的内容长度是变化的。
--创建字符串替换函数
create function fgetstr(@str varchar(1000))
returns varchar(1000)
as
begin
set @str=replace(@str,'<BR>分科类名:',',')
set @str=replace(@str,'<BR>病名:',',')
set @str=replace(@str,'<BR>症状名:',',')
set @str=replace(@str,'<BR>症状概述:','')
set @str=left(@str,len(@str)-patindex('%<BR>%<BR><BR>',@str)-1)
return (@str)
end
go--测试
select dbo.fgetstr('内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>')--在查询中使用
select dbo.fgetstr(content) from jbxx--删除函数
drop function fgetstr
--创建字符串替换函数
create function fgetstr(@str varchar(1000))
returns varchar(1000)
as
begin
set @str=right(@str,len(@str)-5) --去掉'总科类名:'这几个字
set @str=replace(@str,'<BR>分科类名:',',')
set @str=replace(@str,'<BR>病名:',',')
set @str=replace(@str,'<BR>症状名:',',')
set @str=replace(@str,'<BR>症状概述:','')
set @str=left(@str,len(@str)-patindex('%<BR>%<BR><BR>',@str)-1)
return (@str)
end
提示错误信息: 在关键字 'select' 附近有语法错误。
--try:
--创建字符串替换函数
create function fgetstr(@str varchar(1000))
returns varchar(1000)
as
begin
set @str=right(@str,len(@str)-5) --去掉'总科类名:'这几个字
set @str=replace(@str,'<BR>分科类名:',',')
set @str=replace(@str,'<BR>病名:',',')
set @str=replace(@str,'<BR>症状名:',',')
set @str=replace(@str,'<BR>症状概述:','')
set @str=left(@str,len(@str)-patindex('%<BR>%<BR><BR>',@str)-1)
return (@str)
endgo--测试
select dbo.fgetstr('总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>')--在查询中使用
--创建测试表
create table jb(content varchar(200))
insert into jb values('总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>')
select dbo.fgetstr(content) from jb--删除函数
drop function fgetstr
drop table jb
其实: '总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>' 只不过是content字段的内容之一,他还有别的啊! 如:'总科类名:外科<BR>分科类名:皮肤病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>' 所以一定得用content字段做参数传递才行。还有我其实是想单独分别取出 内科,传染病,病毒性疾病,流行性感冒 !如何做啊!真麻烦你了。谢谢!
你还是不在吗?
问你最后一个问题:
我其实是想单独分别取出 内科,传染病,病毒性疾病,流行性感冒 !如何做啊! 真麻烦你了。谢谢!
'总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>' 只不过是content字段的内容之一,他还有别的啊! 如:'总科类名:外科<BR>分科类名:皮肤病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>' 按照我的理解:
总科类名:内科 为第一组数据
分科类名:传染病 为第二组数据
每组数据之间用<BR>分隔
是这样的吗?
可是,这句'症状概述:<BR>头痛,咽喉红肿。'
又不符合上述规范.
你解释一下先吧
--参数@str为整个字符,参数@name为类别名,返回指定类别的值
create function fgetstr(@str varchar(1000),@name varchar(100))
returns varchar(1000)
as
begin
declare @i1 int,@i2 int
select @str='<BR>'+@str+'<BR>',@name='<BR>'+@name+':'
set @i1=charindex(@name,@str)
set @i2=charindex('<BR>',@str,@i1+1)-@i1
set @str=substring(@str,@i1,@i2)
set @str=right(@str,@i2-len(@name))
lbexit:
return (@str)
endgo--测试
select dbo.fgetstr('总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>','总科类名')
select dbo.fgetstr('总科类名:内科<BR>分科类名:传染病<BR>病名:病毒性疾病<BR>症状名:流行性感冒<BR>症状概述:<BR>头痛,咽喉红肿。<BR><BR>','病名')
go--删除自定义函数,在你的程序中不要执行这一句,删除了函数以后就不能用了.
drop function fgetstr
我把select dbo.fgetstr(content) from binli套到我那用时,就不行了,不能把字段当参数传递了。是什么意思?你在你的程序中是怎么样用的.
真不好意思,这是我的一个疏忽,当时binli表中的content字段中含有空值,空值传过去当然会出错了。把空值过滤掉就没问题了。
真的十分谢谢你,问题解决了。你的SQL学的那么棒,真是佩服极了。