朋友们,SQL Server数据库在国内广泛应用,目前应该还有不少基于SQL Server 2000的应用,如果您还在用SQL Server 2000,笔者建议您升级到SQL Server 2008或更新版本。笔者结合自身应用谈谈具体体会。

SQLServer2000已经落伍了

笔者之前的开发的系统,有些是基于SQL Server 2000的,随着操作系统和服务器的升级,逐渐发现SQL Server 2000连安装都是问题。刚开始我建议客户安装Windows Server 2003,因为方便安装SQL Server 2000。但客户总会问:我买这么好的服务器,为何要安装如此过时的操作系统呢?

sql server 2012数据库教程第3版(数据库大师成长日记)(1)

是啊,这是没有道理的。时代变了、人的头脑和思维也要跟着改变。所以逐渐的,客户出现了多个SQL Server版本并存,有2000的、有2008的、还有2016的,可能是笔者前期对数据库的升级采取了一种消极态度,后来就出现了很多后遗症,比如备份的还原就经常出岔子,更不要说SQL语法的支持了。

后来笔者痛下决心,统一升级到SQLServer 2016,虽然遭遇了不少波折,但总算统一了,维护起来也更方便了。

其实从SQLServer 2000升级到2016,要解决的不仅是版本统一、维护方便的问题,相对于2000版本,新版SQL Server在功能上,也确实解决了不少笔者曾经头疼的问题。这里简单列举几点,希望对您有所帮助:

新版SQLServer支持的数据类型更丰富

以简单的varchar和nvarchar为例,在2000版本中,varchar最多支持8000个字符,nvarchar最多支持4000个字符。在普通应用中当然不是事儿,但如果您传递的字符数超过了怎么办呢?

笔者就曾经遇到过,在ERP系统中保存单据时,为了保持事务的一致性,我将SQL语句打包在一起,作为varchar参数传递到存储过程解析后逐条使用exec执行。后因长度问题笔者就改用了text类型传递,写的解析脚本非常复杂。在新版中这根本不是事儿,因为有varchar(max)、nvarchar(max)。

当然,最好的方法并非varchar(max),表值参数Json会更好。表值参数直接传递内存表到存储过程中、Json类型可以将单据的数据转换为Json直接通过SQL语句查询,这样连解析的过程都免了。

新版SQLServer支持的SQL语法更丰富

sql server 2012数据库教程第3版(数据库大师成长日记)(2)

比如我们处理数据时,可能会碰到存在则使用update更新、不存在则使用insert插入的方式,2000中笔者一般这样实现:

if exists(select * from 表 where 条件) begin update 表 end else begin insert into 表 end

在新版的SQLServer中,提供了Merge语句:

MERGE 目标表 USING 源表 ON 匹配条件 WHEN MATCHED THEN 语句 WHEN NOT MATCHED THEN 语句;

还有比如定义变量并赋初始值问题,在2000中是无法定义时直接赋值的,看下面的对比。

2000写法:

declare @myname nvarchar(20) set @myname='网云技术'

新版写法:

declare @myname nvarchar(20)='网云技术'

还有比如我们执行插入语句时,新版可以一条插入语句同时插入多条数据

2000写法:

insert into T(FID, Name) values(1, '马云') insert into T(FID, Name) values(2, '马化腾') insert into T(FID, Name) values(3, '刘强东')

新版写法:

insert into T(FID, FName) values(1, '马云'), (2,'马化腾'), (3,'刘强东')

还有比如我们对一个整数变量加累加整数的时候,2000使用:

set @id=@id 1

在新版中,采用了类似C的语法:

set @id =1

等等等等,对于喜欢写存储过程的朋友来说,大量应用这些新语法,您写起来的感觉就更爽了。

sql server 2012数据库教程第3版(数据库大师成长日记)(3)

当然,2000的数据库想要直接升级到2016是很困难的,等下次再说吧。

,