一个简单的存储过程 这用个SELECT 语句就能实现 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 alter proc sp_Add100 @s varchar(100) ,@result varchar(300) outputasbegin declare @a varchar(100),@i int=0set @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 您这问的不是地方啊,应该去 SQL Server 板块那里问问。 我觉得在不少情况下,这样做很正常比如 分割表中的跟踪号的三个部分,然后增减,把结果写到另一些表里,用store proc比读出来,在C#里做,然后再写回去,要好。 我不太赞同你的说法 “这样做很正常” 首先 这样做是不正常的 因为这样做并不好 不是说不行 而是不好数据库设计的三范式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的大力支持 这个问题网上还真没有。。。大家来帮帮忙! BMP,TIF文件在C#里如何压缩? c#中如何实现画图工具中的那种文本输入框,并且可以改变其位置和大小 windows phone播放实时视频 进程间通讯的问题 三个简单的问题100分(.net新手)在线等! 写代码时,你们的SQL语句是放在什么地方的? 请问用WebBrowser如何显示地址栏啊? OLD DB for ORACLE 817的连接字符串该怎么写? 软件工程---关于"智能家居"管理系统,谁能给些这方面的资料?急急急.. 问个正则匹配的问题 EF POCO作用何在
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
我不太赞同你的说法 “这样做很正常” 首先 这样做是不正常的 因为这样做并不好 不是说不行 而是不好数据库设计的三范式
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的大力支持