因为工作原因,有幸了解到微软SQLSERVER版本差异,主要从SQL6.5至SQL2017版本的所遇到的差异语法。本人所了解到的,从SQL2008至SQL2017的语法上基本没有差异,至少目前所遇到的情况是从SQL2008升级至SQL2017的数据库不需要做语法的migration。所以差异对比是以SQL2008以下版本与SQL2008版本的对比。
首先先看一下各SQL版本的Compatibility level:
查看数据库的兼容级别与排序规则的SQL:
SELECT compatibility_level, collation_name FROM sys.databases WHERE
name=@database
也可以在数据上右键查看属性→Options中查看Compatibility
level,SQL2000及以下版本的没法查看属性。以下是SQL2008及SQL2017版本:

1.=null VS is null(经确认,SQL6.5至SQL2008返回结果是一致的)
SQL6.5 & SQL2000 版本下where 条件可以使用 where
table.column=null或<>null进行筛选数据,但是在SQL2008(可能是从SQL2005开始,因为没有在SQL2005上尝试过,所以不太确定,下同,本文暂时忽略SQL2005版本)无论是=null或<>null条件都是不成立的,需要写成where
table.column is null 或 is not null ;

2.(* =、=* ) VS (left join、right join)

SQL6.5 & SQL 2000 SQL2008
select * form A, B where A.ID*=B.AID select * from A left join B on A.ID=B.AID
select * from A, B where B.AID=*A.ID select * from B right join A on A.ID=B.AID
select * from A, B where A.ID=B.AID select * from A join B on A.ID=B.AID
3.Dump

SQL6.5 & SQL 2000 SQL2008
DUMP TRANSACTION [database name] WITH TRUNCATE_ONLY
DUMP TRANSACTION [database name] with no_log IF (SELECT
DATABASEPROPERTYEX((SELECT DB_NAME()), 'RECOVERY')) = 'FULL'
BEGIN
ALTER DATABASE [database name] SET RECOVERY SIMPLE
ALTER DATABASE [database name] SET RECOVERY FULL
END
DUMP DATABASE [database name] TO [logical device] WITH NOUNLOAD, INIT, SKIP
BACKUP DATABASE [database name] TO [logical device] WITH NOUNLOAD, INIT, SKIP
4.Load

SQL6.5 & SQL 2000 SQL2008
load database [database name] from "c:\Databases\test20190215.bak" RESTORE
DATABASE [database name] FROM DISK = "c:\Databases\test20190215.bak"
5.DBCC

SQL6.5 & SQL 2000 SQL2008
DBCC NEWALLOC(Database) WITH NO_INFOMSGS DBCC CHECKALLOC(Database) WITH
NO_INFOMSGS
DBCC TEXTALLOC(table) WITH NO_INFOMSGS DBCC CHECKtable(table) WITH NO_INFOMSGS
DBCC TEXTALL(Database) WITH NO_INFOMSGS DBCC CHECKDB(Database) WITH NO_INFOMSGS
DBCC DBREINDEX ALTER INDEX PK_ID ON table REBUILD
DBCC INDEXDEFRAG ALTER INDEX PK_ID ON table REORGANIZE
DBCC showcontig sys.dm_db_index_operational_stats
6."+" & Ltrim & Rtrim

SQL版本 select ltrim('')/rtrim('') '' null+'ABC' null+10000 null+getdate()
SQL兼容级别=65 null null ABC null null
SQL兼容级别80及以上 (空) (空) null null null
7.Order by 表.字段别名

SQL6.5 & SQL2000 SQL2008
select column1 as c1 from table1 order by c1 Y Y
select column1 as c1 from table1 order by table1.c1 Y N
select column1 as c1 from table1 t1 order by t1.c1 Y N
select column1 as c1 from table1 t1 order by t1.column1 Y Y
8.Order by select中的重复字段

SQL6.5 & SQL2000 SQL2008
select column1 as c, column2 as c from table1 order by c Y N
在SQL2008及后期的版本是不允许的,无法判断到底按照哪一个字段进行排序,而SQL2000及之前的版本是按照最前select的字段进行排序。

9.在SQL2008及之后Order by字段必须是 distinct的字段中的

SQL6.5 & SQL2000 SQL2008
select distinct column1 from table1 order by column2 Y N
10.replace遇到char类型

SQL6.5 & SQL2000 SQL2008
SELECT '<' + REPLACE(CONVERT(char(10), ' AB C '), ' ', 'L') + '>' <LLABLC>
<LLABLCLL>
SELECT '<' + REPLACE(CONVERT(VARCHAR(10), ' AB C '), ' ', 'L') + '>' <LLABLCLL>
<LLABLCLL>
如表格中各SQL版本输入的结果我们对比得知,在SQL6.5及SQL2000版本replace函数会将char类型的字段右边的空格先去掉再替换。

11.系统表

SQL6.5 & SQL2000 SQL2008
sysobjects sys.objects
syscolumns sys.columns
syscomments sys.sql_modules
master..Sysdatabases sys.databases
12.Group by
在sql2000 with 80兼容级别的数据库查询出来的结果如下:

在sql2000 with 65兼容级别的数据库查询结果:

由以上两张对比图可以看出,在sql65兼容级别下的sql语法,group by是含有排序功能,从sql2000开始已经不含有排序功能了。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信