看《关于邹建书中的一个用户函数》一帖的问题?

jwt1982 2006-03-02 04:27:04
原帖:http://community.csdn.net/Expert/topic/4564/4564564.xml

看完后,完全复制该代码到我机器运行,结果出现错误
原贴循环体
while charindex(@s,@split)>0
begin
insert @re values(left(@s,charindex(@s,@split)-1))
set @s=stuff(@s,1,charindex(@s,@split)+@splitlen,'')
end

后改正循环体,如下,方正常

while charindex(@split,@s)>0
begin
insert @re values(left(@s,charindex(@split,@s)-1))
set @s=stuff(@s,1,charindex(@split,@s)+@splitlen-1,'')
end
insert @re values(@s)

1、charindex用法和该贴正好相反
2、在set @s=stuff(@s,1,charindex(@split,@s)+@splitlen-1,'')中少写一个1

百思不得其解,请问是否是版本不同的原因呢?
是不是原帖的作者漏写了呢?谢谢邹老大或其他大大近来解释一下
...全文
108 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jwt1982 2006-03-03
  • 打赏
  • 举报
回复
呵呵,这样知道了
Yang_ 2006-03-03
  • 打赏
  • 举报
回复
能得出正确数据就可以了

结束了吧
Yang_ 2006-03-03
  • 打赏
  • 举报
回复
你改了原来 贴的一个代码

原贴
set @splitlen=len(@split+'a')-2


set @splitlen=len(@ss)

所以你需要-1,原贴不需要
Yang_ 2006-03-03
  • 打赏
  • 举报
回复
是的,关于charindex那个贴的代码是错误的
jwt1982 2006-03-03
  • 打赏
  • 举报
回复
TO:Yang_(扬帆破浪)
declare @s nvarchar(3000)
declare @ss nvarchar(10)
declare @re table(col nvarchar(100))
declare @splitlen int



set @s='132,199,999,993,21000,00032188,888'
set @ss=','
set @splitlen=len(@ss)

while charindex(@ss,@s)>0
begin
insert @re values(left(@s,charindex(@ss,@s)-1))
set @s=stuff(@s,1,charindex(@ss,@s)+@splitlen-1,'')
--insert @re values(@s)
end
insert @re values(@s)


select * from @re

这样返回的是
132
199
999
993
21000
00032188
888

如果改成

set @s='132,199,999,993,21000,00032188,888'
set @ss=','
set @splitlen=len(@ss)

while charindex(@ss,@s)>0
begin
insert @re values(left(@s,charindex(@ss,@s)-1))
set @s=stuff(@s,1,charindex(@ss,@s)+@splitlen,'')
--insert @re values(@s)
end
insert @re values(@s)


select * from @re

结果是这样的

132
99
99
93
1000
0032188
88

所以我添加了一个1
jwt1982 2006-03-03
  • 打赏
  • 举报
回复
那么,是不是我看的帖子,那个楼主的写法有错误呢?
Yang_ 2006-03-03
  • 打赏
  • 举报
回复
2、在set @s=stuff(@s,1,charindex(@split,@s)+@splitlen-1,'')中少写一个1

这个应该不用改
set @s=stuff(@s,1,charindex(@split,@s)+@splitlen,'')
Yang_ 2006-03-03
  • 打赏
  • 举报
回复
楼主正确
jwt1982 2006-03-03
  • 打赏
  • 举报
回复
呵呵,我机器上的连机帮助怎么和你们的不一样,而且运行起来还不一样????

CHARINDEX
返回字符串中指定表达式的起始位置。

语法
CHARINDEX ( expression1 , expression2 [ , start_location ] )

参数
expression1

一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。

expression2

一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。

start_location

在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数或零,则将从 expression2 的起始位置开始搜索。

返回类型
int
-------------------------------------------------------------
也就是说,在我这里,第一个参数是子串,第二个参数才是母串
正好和你们提供的是相反的?为什么?
msjqd 2006-03-03
  • 打赏
  • 举报
回复
chaindex(@key,@spilt_string)
位置查找函数

@key:表示在字符串中查找的表示符
@spilt_string:表示查找的字符串

stuff(@str,@start_pos,@end_pos,@stuff_str)
根据位置把原字符串中的 @start_pos 到@end_pos之间的字符串改成 @stuff_str 字符串

@str :要替换的总字符串
@start_pos:替换的起始位置
@end_pos :替换的结束位置
@strff_str:替换成字符串

stuff('123456',2,3,'888')
188856
把 234 替换成 888

34,594

社区成员

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

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