这几种数据表更新方式,哪种更好?敬请指点!
更新数据表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




