日期:2014-05-18  浏览次数:20443 次

这几种更新记录的方法,哪种更好?
更新数据表记录,需要更新的列是在调用时动态改变的,因此在设计存储过程阶段是不知道的,所以需要考虑到所有的列,我想到有三种方法:
1、动态SQL语句
语句大概如下:
...   ...
SET   @SQL   =   'UPDATE   DataTable   SET   '
IF   @Field1   IS   NOT   NULL
        BEGIN
                IF   @NeedComma   =   1
                        SET   @SQL   =   @SQL   +   ',   '
                SET   @SQL   =   @SQL   +   'Field1   =   @Field1 '
                SET   @NeedComma   =   1
        END
IF   @Field2   IS   NOT   NULL
        BEGIN
                IF   @NeedComma   =   1
                        SET   @SQL   =   @SQL   +   ',   '
                SET   @SQL   =   @SQL   +   'Field2   =   @Field2 '
                SET   @NeedComma   =   1
        END
...   ...
SET   @SQL   =   @SQL   +   '   WHERE   RecordID   =   @RecordID '
EXEC   sp_executeSQL   @SQL,   ...   ...
...   ...

2、最小化更新
...   ...
IF   @Field1   IS   NOT   NULL
        BEGIN
                UPDATE   DataTable   SET   Field1   =   @Field1   WHERE   RecordID   =   @RecordID
        END
IF   @Field2   IS   NOT   NULL
        BEGIN
                UPDATE   DataTable   SET   Field2   =   @Field2   WHERE   RecordID   =   @RecordID
        END
...   ...

3、全部更新
...   ...
UPDATE
        DataTable
SET
        Field1   =   CASE   WHEN   @Field1   IS   NOT   NULL   THEN   @Field1   ELSE   Field1
        Field2   =   CASE   WHEN   @Field2   IS   NOT   NULL   THEN   @Field2   ELSE   Field2
WHERE
        RecordID   =   @RecordID
...   ...

大家觉得以上三种方法哪种更好?谢谢!

------解决方案--------------------
耗时:

1 < 3 < 2
------解决方案--------------------
支持Limpire(昨夜小楼)
个人认为方案1的性能最高,毕竟只执行一次DB更新。
也请高手能够来讲解一下原理
关注ing………………

------解决方案--------------------
我觉得三种方法都差不多,关键到实际数据中去测试,有时理论的不一定对,例如有人说游标慢,但实际中用游标就是快,这与理论完全相反了
------解决方案--------------------
2.1、最小化更新
... ...
IF @Field1 IS NOT NULL
BEGIN
IF @Field2 IS NOT NULL
UPDATE DataTable SET Field1 = @Field1,Field2 = @Field2 WHERE RecordID = @RecordID
ELSE