日期:2014-05-19  浏览次数:20415 次

关于substring()函数
我有一个存储过程,需要辨析字符串中的子串

但是substring提取出来的字符串都是一半
{AB6A7A55-DAC9-4093-BD65-1BB3A8C3AA45}|{7CCC6907-D10F-4200-89EB-DDD5F1021FB


这个是我的原串,按照程序应该是{AB6A7A55-DAC9-4093-BD65-1BB3A8C3AA45}截取下来,但是现在每一个都是30个字符,也就是{AB6A7A55-DAC9-4093-BD65-1BB3A       就结束了,为什么?每个子串之间我用‘|’来区分,而且游标都正确。

难道substring函数有长度限制?


------解决方案--------------------
不是substring函数有长度限制问题,可能是你的SQL中substring的参数值传入有问题。


把这个SQL 的各个参数都print出来看看。
------解决方案--------------------
存放字符串的变量的长度是不是太短了?
------解决方案--------------------
恩,不是substring的限制,应该是语句的问题
------解决方案--------------------
如何将 '2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1 '按 '| '分割成
2006-01-12
2006-02-13
2006-03-15
2006-11-11
2003-1-1


declare @Days varchar(4000)
declare @tmpDay varchar(10)
set @Days= '2006-01-12|2006-02-13|2006-03-15|2006-11-11|2003-1-1 '
set @tmpDay= ' '
declare @i int
set @i=0
while @i <len(@Days)
begin
set @i=@i+1
if SUBSTRING(@Days,@i,1)= '| '
begin
print left(@Days,@i-1)
set @Days=SUBSTRING(@Days,@i+1,len(@Days))
set @i=0
end
end
print @Days


输出结果:
2006-01-12
2006-02-13
2006-03-15
2006-11-11
2003-1-1


一字段信息包括如下:李三|李三@d.com|公司|单位地址|
我将查询用(Select)只列出李三及单位地址的方法?

create table #t(c1 varchar(100))
insert into #t select 'li4|33@com|mircrosoft|china| '
insert into #t select 'zhang3|zhang3@163.com|IBM|USA| '
insert into #t select '李三|李三@d.com|公司|单位地址| '


select substring(c1,1,charindex( '| ',c1)-1) as name,
reverse(substring(reverse(c1) , 2 , charindex( '| ' , reverse(c1) , 2) - 2)) as address from #t

drop table #t

name address
----- -------
li4 china
zhang3 USA
李三 单位地址

(所影响的行数为 3 行)
------解决方案--------------------
问题是你存放截取字符串的变量长度太小了
------解决方案--------------------
declare @ch varchar(100)
set @ch= '{AB6A7A55-DAC9-4093-BD65-1BB3A8C3AA45}|{7CCC6907-D10F-4200-89EB-DDD5F1021FB '
print substring(@ch,0, CHARINDEX( '| ',@ch))
--{AB6A7A55-DAC9-4093-BD65-1BB3A8C3AA45}
------解决方案--------------------
把字符串变量的长度定长些试试吧.