对于字符串的操作,一般使用的都是stuff方法,但是对于varchar(max)类型的列来说,在2005以后,还增加了另外一种方法:WRITE ( expression, @Offset , @Length )。对于wirte函数的使用,见联机文档。一般来说,1)、Write与stuff的作用相类似,但是稍有区别。2)、write的效率能高一些。以下是一些说明与测试。
--建立测试表
if object_id('tempdb..#1') is not null
drop table tempdb..#1
go
CREATE TABLE tempdb..#1 (
[id] [bigint] IDENTITY(1,1) NOT NULL,
[dtcol] [datetime] NULL,
[charcol] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL,
[maxcol] [varchar](max) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [pk_id] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
Go
--向测设表中插入10W条数据
declare @i int @dt datetime
select @i=0,@dt='1900-1-1'
while @i<100000
begin
insert into tempdb..#1 (dtcol,charcol,maxcol)
values(@dt+@i,replicate(char(rand()*26+65),100),replicate(newid(),100))
set @i=@i+1
end
一、区别:
1)、Stuff函数:函数为stuff(maxcol,30,4,'abcd'),那么是从第三十位开始进行替换,即第30位也同样在替换的范围内。
2)、Write方法:函数为maxcol.write('abcd',30,4),那么是从第31为开始进行替换。
3)、write方法只能用在update中,而stuff函数可以使用在select中。
二、功能相同
效率测试
/*一下语句每次测试的时候都要执行*/
--清空缓存
Checkpoint
dbcc freeproccache
dbcc dropcleanbuffers
go
--查看时间
set statistics time on
go
declare @t datetime
set @t=getdate()
--测试时stuff运行一次,相应的write也执行一次
update #1
set maxcol=stuff(maxcol,31,4,'abcd')
select datediff(ss,@t,getdate())
结论:从整体情况来看,write的效率比stuff还是能高一些,主要体现
1)、在对max列的字符的开头和末尾,效率能高一点。原因:当执行stuff的时候,会加载整个字符串,而write不会加载整个字符串。
2)、如果对字符串内部的字符串进行操作的话,效率基本相同,见第一条测试情况。虽然从datediff的时间来看,write的时间比较少,但是总体实际运行时间是基本上相同的,因为write的方法出了执行,还需要进行编译
3)、对于write方法,语句的执行时间占总的实际运行时间的一半,因为使用write方法需要进行编译,然后执行。Datediff显示的是执行时间,实际运行时间-datediff的时间就是对sql编译的时间。