也许由于最近心情不好,这两天也在工作和人较起了真,这可和咱平时与人为善,不穷追猛打的作风有出入。这不,昨天刚就一个究竟是基本设计、详细设计和代码制造中的哪个环节出错的问题和一个同事争论得口干舌燥,今天又心情不爽地在Stuff()函数上和另外一个同事较起了真。不过,幸好这两次我都没有出错。
不说乱七八糟的了,就对Stuff()函数做下温习吧,虽然自己是对的,但温故而知新嘛。其实问题不麻烦,就是一个要做一个处理,把字符串格式化一下。比如,数据库表中有三个字段,要以xxxx-xxxxxx-xxxxxx的格式输出,其中不满相应位数的,在后面补空格,即把类似23,1234,879这样的三个数以如下形式输出到报表中:23__-1234__-879___的格式输出,标注颜色的下划线一种颜色代表一个空格。争论的焦点是能不能在数据库(本人用的SQL Server)中进行转换处理。同事认为不能,我认为可以。我告诉他用Stuff()函数处理。我没有做实验,他做了实验,他的结果是不行,因为会转换出匪夷所思的结果。于是我也进行了调查。结果如下:
1.对Stuff函数功能进行分析:
Stuff(expression1_Str,startIndex,lengthInt,expression2_Str)函数共有四个参数,其功能是将expression1_Str中自startIndex位置起删除lengthInt个字符,然后将expression2插入到expression1_Str中的startIndex位置。
2.做实验:
我先做了如下实验:
STUFF(SPACE(10),0,LEN(‘1234’),‘1234’),转换的结果如右:234______1,即如其所言转换所得之匪夷所思之结果。思考了一会,未解。又做一实验,如下:
STUFF(SPACE(10),1,LEN(‘1234’),‘1234’),此时结果如右:1234______,此时得到了想要的结果。对比之下,即可知何故:一般的程序设计语言和Sql语言一样,都把字符串当作字符数组处理,但一个差别在于,大多数程序设计语言的数组下标起始位为0,而Sql Server中为1,由于惯性思维,常常把一般程序设计语言中的0起始位带至SQL编程中。故而当第一次实验时,从0位开始删除和插入,而0位不存在,故将最末位做为0位来处理了。而第二次从1开始就没有错了。
于是,同事的问题就非常简单的解决了:
STUFF(SPACE(4),1,LEN(‘23’),’23’)+’-’+STUFF(SPACE(6),1,LEN(‘1234’),’1234’)+’-’+ STUFF(SPACE(6),1,LEN(‘879’),’879’),转换结果自然就为23__-1234__-879___了。