兼容模式是否允许新命令?

时间:2018-08-22 21:15:33

标签: sql-server tsql sql-server-2012 sql-server-2017

我有一个以2012兼容模式运行数据库的SQL Server 2017服务器。但是,当我尝试使用2017 T-SQL新命令string_agg()时,它可以工作。我预计会出现语法错误,因为string_agg()在2012模式下无效。

这是我正在使用的SQL:

SELECT
    Compatibility_Level,
    CASE Compatibility_Level
       WHEN 65 THEN 'SQL Server 6.5'
       WHEN 70 THEN 'SQL Server 7.0'
       WHEN 80 THEN 'SQL Server 2000'
       WHEN 90 THEN 'SQL Server 2005'
       WHEN 100 THEN 'SQL Server 2008/R2'
       WHEN 110 THEN 'SQL Server 2012'
       WHEN 120 THEN 'SQL Server 2014'
       WHEN 130 THEN 'SQL Server 2016'
       WHEN 140 THEN 'SQL Server 2017 <<<'
       ELSE 'new unknown - ' + CONVERT(VARCHAR(10), Compatibility_Level)
    END AS VersionName
FROM 
    sys.databases
WHERE
    Name = DB_NAME()

DECLARE @x TABLE (col1 INT, col2 VARCHAR(5))

INSERT INTO @x 
VALUES (1, 1), (1, 2), (1, 3), (2, 1), (2, 2)

SELECT * FROM @x

SELECT col1, string_agg(col2,', ') 
FROM @x 
GROUP BY col1

以下是输出:

Compatibility_Level VersionName
------------------- ------------------------
110                 SQL Server 2012

(1 row affected)

(5 rows affected)

col1        col2
----------- -----
1           1
1           2
1           3
2           1
2           2

(5 rows affected)

col1        
----------- ------------------------------------
1           1, 2, 3
2           1, 2

(2 rows affected)

1 个答案:

答案 0 :(得分:4)

兼容模式的目的是确保在SQL Server的早期版本中有效的语句在新版本的SQL Server中以相同的方式表现

这包括以前有效但在新版本中变得无效的语句,以及含义不同或版本之间行为不同的语句。

在先前版本中无效的语句不包括在此目标中。

为什么?考虑升级。首先,您需要将所有内容都转换为新的语法和函数,然后在您满意所有内容之后,可以提高兼容性级别。如果您不允许在新的兼容性级别中有效的事物(但以前是无效或无意义的事物),那么将很难迁移到更高的级别。