这几种更新记录的方法,哪种更好?
更新数据表记录,需要更新的列是在调用时动态改变的,因此在设计存储过程阶段是不知道的,所以需要考虑到所有的列,我想到有三种方法:
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
UPDATE DataTable SET Field1 = @Field1 WHERE RecordID = @RecordID
END
ELSE IF @Field2 IS NOT NULL
UPDATE DataTable SET Field2 = @Field2 WHERE RecordID = @RecordID
... ...
3.1、全部更新
... ...
UPDATE
DataTable
SET
Field1 = ISNULL(@Field1,Field1)
Field2 = ISNULL(@Field2,Field2)
WHERE
RecordID = @RecordID
[解决办法]
严重同意楼上的意见。