无标题文档
  正在读取数据,请稍侯  
正在读取数据,请稍侯
     
 
公告
正在读取数据,请稍侯
时间记忆
正在读取数据,请稍侯
最新日志
正在读取数据,请稍侯
最新评论
正在读取数据,请稍侯
最新回复
正在读取数据,请稍侯
我的好友
我的相册
站点信息
正在读取数据,请稍侯
  无标题文档
sql server中根据标点分割字符串并替换值的方法
2007-9-24 2:45:00

要干的事:

 

      

表1                                   表2

   

根据sTexture(1)sTextureName(2)的对应关系,将sTexture(1)的值转换为sTextureId(2)的值给表1 sTextureId赋上(顿号就不要了)。结果见表3.

例:表1的第底行“砂土,壤土”转换后为“21

注意:sTexture中最多有三种值。

过程:

sTexture(1)按顿号分割,按分割后的字符串在表2中查找出sTextureId,合并后给sTextureId赋上(1)

这里我们将sTexture值为分割时命名为0str0次分割时的字符串,也就是总共的字符串)、11str(一次分割后第一个字符串)、12str(一次分割后第二个字符串)、21str22str4个主要变量; 所以没有顿号时的字符串为0str,有一个顿号时的字符串为11str12str,有两个顿号时的字符串为11str21str22str。第一个顿号的位置命名为1dot,余下以此类推。

 

T-sql:    

--声明计数器

declare @i int

set @i=1

 

declare @0str char(50)

declare @0strLength int

--Crop表中记录的行数

declare @rows int

select @rows=count(*) from Crop

--第一个顿号的位置

declare @1dot int

--利用循环完成所有行的更新

while (@i<=@rows)

begin

--查出未分割时记录值(这里均指sTexture的值)

select @0str=sTexture from Crop where cropId=@i

--求出记录值的长度

set @0strLength=len(@0str)

--求出第一个顿号的位置,若没顿号则返回0

set @1dot=patindex('%%',@0str)

--如果不存在逗号,则查出记录值对应的id(指sTextureId,下同)并在Crop中更新

if @1dot=0

declare @0strId char

select @0strId =soilTextureId from GiSoilTexture where soilTextureName=@0str

begin

update Crop set sTextureId=@0strId where cropId=@i

end

--如果存在逗号,则开始分割

else if @1dot !=0

--第一次分割后第一个字符串

declare @11str char(50)

--第一次分割后第二个字符串

declare @12str char(50)

--第二个顿号在12str中的位置

declare @2dot int

--求出11str的值

set @11str= substring(@0str,1,(@1dot-1))

--求出12str的值

set @12str= substring(@0str,(@1dot+1),(@0strLength-@1dot))

--求出第二个顿号在12str中的位置

set @2dot =patindex('%%',@12str)

--11strid

declare @11strId char

--查询出11strid

select @11strId =soilTextureId from GiSoilTexture where soilTextureName=@11str

begin

--如果第二个顿号不存在则将11strId12strId合并更新到Crop表中

if @2dot =0

begin

--12strid

declare @12strId char

--查询出12strid

select @12strId =soilTextureId from GiSoilTexture where soilTextureName=@12str

--更新sTextureId(只有一个逗号时)

update Crop set sTextureId=(@11strId+@12strId) where cropId=@i

end

--如果第二个逗号存在,则开始第二次分割

else if @2dot!=0

begin

declare @21str char(50)

declare @22str char(50)

--21strid

declare @21strId char

--22strid

declare @22strId char

--12str的长度

declare @12strLength int

set @12strLength =len(@12str)

--求出21str的值

set @21str = substring(@12str,1,(@2dot -1))

--求出22str

set @22str = substring(@12str,(@2dot+1),(@1dot-1))

--查询她们的id

select @21strId =soilTextureId from GiSoilTexture where soilTextureName=@21str

select @22strId =soilTextureId from GiSoilTexture where soilTextureName=@22str

--更新(有两个个逗号时)

update Crop set sTextureId=(@11strId+@21strId+@22strId) where cropId=@i

end

end

set @i=@i+1

end

 

更新后抓图:

表3

问题:

  结果都正确,但有一个错误提示:

 

  仔细摸索摸索,那个长度参数有错吗?

起舞弄轻影 | 阅读全文 | 回复(2) | 引用通告 | 编辑
  • 标签:sql 字符串 
  • 无标题文档
    Re:sql server中根据标点分割字符串并替换值的方法
    2007-9-25 13:16:00
    耑木子
    耑木子 | 个人主页 | 引用 | 返回 | 删除 | 回复
    无标题文档
    Re:sql server中根据标点分割字符串并替换值的方法
    2007-9-24 3:41:00
    guanghuisir当初的数据设计不完善,导致后来的手忙脚乱,其实这个表没多少行,不过我还是很喜欢。
    还是第一次这样直接地在数据库里调整数据,以前都是读出来再写进去,尤为麻烦。
    guanghuisir | 个人主页 | 引用 | 返回 | 删除 | 回复
    发表评论:
    正在读取数据,请稍侯