关于substring()函数

windsnet2007 2007-03-07 11:33:35
我有一个存储过程,需要辨析字符串中的子串

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



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

难道substring函数有长度限制?
...全文
9281 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
windsnet2007 2007-03-07
  • 打赏
  • 举报
回复
问题找到了,呵呵,谢谢大家了,是因为我在substring外面加了cast(),cast限制了长度。
hui_hui_2007 2007-03-07
  • 打赏
  • 举报
回复
把字符串变量的长度定长些试试吧.
w75251455 2007-03-07
  • 打赏
  • 举报
回复
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}
windsnet2007 2007-03-07
  • 打赏
  • 举报
回复
而且我的@TID长度是varchar(50)
windsnet2007 2007-03-07
  • 打赏
  • 举报
回复
结果打出来了
Set @PointerCurr1=CharIndex('|',@ID_1,@PointerPrev1+1)

打出来 @PointerCurr1 = 39
@PointPrev1 = 1

Set @TID_1 =cast(SUBSTRING(@ID_1,@PointerPrev1,@PointerCurr1-@PointerPrev1) as varchar)

打出来 @TID_1 = 30个字符的字符串

问题就出在substring()了,截取的字符串长度只有30个,但是我带进去的参数是38个啊..郁闷
baoshan 2007-03-07
  • 打赏
  • 举报
回复
问题是你存放截取字符串的变量长度太小了
dawugui 2007-03-07
  • 打赏
  • 举报
回复
如何将'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 行)
jacobsan 2007-03-07
  • 打赏
  • 举报
回复
恩,不是substring的限制,应该是语句的问题
wangdehao 2007-03-07
  • 打赏
  • 举报
回复
存放字符串的变量的长度是不是太短了?
OracleRoob 2007-03-07
  • 打赏
  • 举报
回复
不是substring函数有长度限制问题,可能是你的SQL中substring的参数值传入有问题。


把这个SQL 的各个参数都print出来看看。

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧