这用个SELECT 语句就能实现

解决方案 »

  1.   


    alter proc sp_Add100 
    @s  varchar(100)  ,
    @result varchar(300) output
    as
    begin declare @a varchar(100),@i int=0
    set @result = '' 
    while @i<len(@s)
    begin   
    if( CHARINDEX(',',@s,@i+1)=0) 
    select @a = SUBSTRING(@s,@i+1, len(@s)-@i) ,@i = len(@s),@result +=','+convert(varchar(100), @a + 100) 
    else  
    select @a = SUBSTRING(@s,@i+1, CHARINDEX(',',@s,@i+1)-@i-1),@i = CHARINDEX(',',@s,@i+1),@result +=','+convert(varchar(100), @a + 100) 
     
    end 
    set @result= substring(@result,2,len(@result)-1)
    end 
      

  2.   

    您这问的不是地方啊,应该去 SQL Server 板块那里问问。
      

  3.   

    我觉得在不少情况下,这样做很正常比如 分割表中的跟踪号的三个部分,然后增减,把结果写到另一些表里,用store proc比读出来,在C#里做,然后再写回去,要好。
      

  4.   


    我不太赞同你的说法 “这样做很正常” 首先 这样做是不正常的 因为这样做并不好 不是说不行 而是不好数据库设计的三范式
    http://www.cnblogs.com/jasonjiang/archive/2010/06/23/1763869.html (随便搜了篇,不是我写的,不是广告)
    首先,这样的设计,就违反了第一范式;其他都不用看了,第一范式是最基础范式;有这样的范式规定也好,约束也好,职业道德也好; 是有它的道理的;我们假设有这样的场景,软件版本号,这个很常用吧,你可以把它的主次版本号用分隔符分隔,存储在一个字段里
    那么 我们需要升级主版本号 我们需要做什么 当然是要把这个字符串先分隔开来,然后,主版本号类型转化,主版本号+N,与次版本号合并(用分隔符分隔),然后,持久。对吧,我这里没说是在什么地方做,可能是DB,可能是程序,原理一样的,对吧。虽然这将是一个短暂的过程,以至于再烂的程序,一分钟也可以处理几万个这样的过程。那么,我们再从另外一个角度来分析这个问题,CPU和内存的角度,同样不考虑是在什么环境来处理。
    1. 拆分一个字符串,那拆分这个动作,使需要CPU时间的,这个没有疑问,对不对。
    2. 拆分出来两个字符串(主版本,次版本号),现在我们有几个字符串在内存中,不是两个,是三个,对不对,还有一个是未拆分的字符串。这个过程也需要CPU时间,要给新生成的字符串分配内存空间。
    3. 然后,再做类型转换,也需要CPU时间对不对。
    4. 然后,通过了计算,再合并成新的字符串,又需要新的内存了,又要占用CPU时间了。这个过程和拆分是一样的吧。
    5. 如果这个场景,移植到程序代码里,那么必然会有个字符串来记录这个版本号,可以想象,以后的split会很多。(当然,很多同学会喊,我的属性是个struct或者我干脆用Version类型,那么,就不会有很多split了,但至少你在DB读出和写入的时候,要做拆分和合并吧)那么,同样是这个场景,我们再来看看,如果符合了第一范式,会是什么样的过程,版本号也可以设计成两个数值型字段来分别存储(至于,那些不确定分隔个数的,使用主从表,就不细说了)
    1. 拆分就不需要了,对不对
    2. 不用重新分配内存了,对不对
    3. 不用做类型转换了,对不对
    4. 没有合并的必要了,对不对
    5. 只是定义一个struct或version类型当作属性,不需要那些字符串操作了。当然,我列的12345并不是所有过程,只是挑几个主要的,又差异的过程,说明问题而已,不必太纠结。我们再来看看,以空间换时间(这个是软件工程中经常用到的,提升性能的方法)吧。
    很显然,从上面的场景分析中,可以看出,违反第一范式的设计,消耗了很多空间,你的分隔符越多,占用的空间越大,同时,消耗的CPU时间就越多,这并没有达到以空间换时间的目的,对不对。
    符合第一范式的设计,虽然我们多了一个字段或者多了个从表,但是却节约了内存空间和不必要的计算。
    究竟哪种是以空间换时间,不言而喻了吧。所以我在一开始回复中,指出,这是个设计问题,没有说这么细,是因为心情不好 - -!(不是借口哈,确实不太好)今天又来补充,是因为这将是个很严重的问题,是需要初学者花点心思理解、掌握、注意的问题。好了 谢谢CCTM MV AV的大力支持