CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

这几种数据表更新方式,哪种更好?敬请指点!

楼主chequan(chequan)2006-03-08 13:54:27 在 MS-SQL Server / 基础类 提问

更新数据表Table_1,该表假设有多个字段(假设10个,Field0~Field9)  
  @Field0~@Field9为传递给存储过程的参数,形如:  
  (  
  @id   int,  
  @Field0   nvarchar(1000)   =   NULL,  
  @Field1   nvarchar(1000)   =   NULL,  
  ...   ...  
  @Field9   nvarchar(1000)   =   NULL  
  )  
  因为表需要更新的字段可能是不定的,有时可能是全部字段,有时可能其中的某一个或某几个字段,因此我将传递的字段默认值设为NULL,以便存储过程中判断。以下为三种方法,哪种更好?谢谢!  
   
  方法1:  
  UPDATE  
          Table_1  
  SET  
          Field0   =    
                  CASE  
                          WHEN   @Field0   IS   NULL   THEN   Field0  
                          ELSE   @Field0  
                  END,  
          Field1   =    
                  CASE  
                          WHEN   @Field1   IS   NULL   THEN   Field1  
                          ELSE   @Field1  
                  END,  
          ...   ...  
          Field9   =    
                  CASE  
                          WHEN   @Field9   IS   NULL   THEN   Field9  
                          ELSE   @Field9  
                  END  
  WHERE  
          id   =   @id  
   
  方法2:  
  IF   @Field0   IS   NOT   NULL  
          UPDATE  
                  Table_1  
          SET  
                  Field0   =   @Field0  
          WHERE  
                  id   =   @id  
          ...   ...  
          UPDATE  
                  Table_1  
          SET  
                  Field9   =   @Field9  
          WHERE  
                  id   =   @id  
   
  方法3:  
  DECLARE   @SQL   nvarchar(max)  
  DECLARE   @NeedComma   bit  
  SET   @SQL   =   'UPDATE   Table_1   SET   '  
  SET   @NeedComma   =   0  
  IF   @Field0   IS   NOT   NULL  
          BEGIN  
                  IF   @NeedComma   =   1  
                          SET   @SQL   =   @SQL   +   ',   '  
                  SET   @SQL   =   @SQL   +   'Field0   =   @Field0'  
                  SET   @NeedComma   =   1  
          END  
  ...   ...  
  IF   @Field9   IS   NOT   NULL  
          BEGIN  
                  IF   @NeedComma   =   1  
                          SET   @SQL   =   @SQL   +   ',   '  
                  SET   @SQL   =   @SQL   +   'Field9   =   @Field9'  
                  SET   @NeedComma   =   1  
          END  
  SET   @SQL   =   @SQL   +   '   WHERE   id   =   @id'  
  EXEC   sp_executeSQL   @SQL,   N'@id   int,@Field0   nvarchar(1000),   ...   ...   ,   @Field9   nvarchar(1000)',   @id   =   @id,   @Field0   =   @Field0,   ...   ...   ,   @Field9   =   @Field9  
   
  请问上面三种方法哪个更好?我测试的结果是有时这个好,有时那个好。我不能确定哪个方法好?请指点,谢谢! 问题点数:20、回复次数:8Top

1 楼hsj20041004(光芒)回复于 2006-03-08 14:06:28 得分 10

方法1就很好,简单明白!Top

2 楼chequan(chequan)回复于 2006-03-08 14:13:51 得分 0

我想知道的是在性能、速度和效率上方面,哪个更优?谢谢!Top

3 楼iexiaoer(happy)回复于 2006-03-08 16:27:19 得分 10

我个人认为第一种方法比较好些。  
  UPDATE  
          Table_1  
  SET  
          Field0   =    
                  CASE  
                          WHEN   @Field0   IS     NOT   NULL   THEN   @Field0  
                  END,  
          Field1   =    
                  CASE  
                          WHEN   @Field1   IS   NOT   NULL   THEN   @Field1  
                  END,  
              ......  
  这样是不是更明了。  
  Top

4 楼iexiaoer(happy)回复于 2006-03-08 16:28:29 得分 0

并且,我个人认为,第一种在性能上,效率上也优于后两种!Top

5 楼chequan(chequan)回复于 2006-03-08 16:42:30 得分 0

如果是第一种的话,假设只更新一个字段,这个方法也会更新全部的字段。  
  也就是说,第一种方法总是会更新所有的字段。这在只更新一个字段的时候,效率会不会很低下?Top

6 楼chequan(chequan)回复于 2006-03-08 18:46:54 得分 0

一位高手的解答:  
  第一个方法显然不好,实际上第一个方法不管你传不传值表的每一个字段都会更新,只是如果传值则更新为新值,不传值还是更新为原来的值.  
   
  第二个方法你是根据传不传值来一条一条的判断进行更新,比第一个方法效率高一些,  
  但显然一条一条的更新不如批量更新效率高.  
   
  同前面二个方法比较来说第三个方法应该是最好的,但这样的写法有一些复杂,应该能  
  够找到一个比较简便的方法来实现.    
  ----------------------------------  
  谢谢高手!你的分析和我分析的一样。  
  第一个即使只需要更新一个字段,它也会更新每个字段。  
  第二个如果更新字段数比较多的话,实际上就会有多个更新的语句执行。  
  第三个采用动态SQL,据说动态SQL没法预编译,效率也是个问题。  
   
  但是象我这样的情况。实现无法知道更新的字段的情况下,如何写存储过程好些?谢谢!!!SQL2005有没有什么好的方法?      
  Top

7 楼xeqtr1982(Visual C# .NET)回复于 2006-03-08 18:56:06 得分 0

学习:)Top

8 楼chequan(chequan)回复于 2006-03-09 12:53:55 得分 0

高手们,都进来说说呀!Top

相关问题

  • 请指点,循环更新某个数据表内的数据的问题,请帮忙!
  • 数据表更新问题(急)
  • 如更新大批量更新数据表
  • 请教个数据表设计小问题,请高手指点!!!
  • 一个典型的数据表递进更新问题
  • 用SQL如何更新数据表的图片?
  • 一个用SQL更新数据表很菜的问题
  • 为什么我不能更新数据表?
  • 请教:用TADOQuery如何实现更新多个Access数据表?
  • 关于两个数据表更新的问题

关键词

  • 字段
  • 存储过程
  • sql
  • null
  • needcomma
  • 更新
  • field
  • 方法
  • 效率
  • 谢谢

得分解答快速导航

  • 帖主:chequan
  • hsj20041004
  • iexiaoer

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo