sql-server - 兼容模式允许新命令?

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

我有一个 SQL Server 2017 服务器以 2012 兼容模式运行数据库。但是,当我尝试使用 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)

最佳答案

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

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

在之前的版本中无效的声明不包括在这个目标中。

为什么?考虑升级。您首先想要将所有内容转换为新的语法和函数,然后当您满意一切就绪时,您可以提高兼容性级别。如果您不允许在新兼容级别中有效的内容(但之前无效或无意义),那么迁移到更高级别就变得困难。

关于sql-server - 兼容模式允许新命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51975244/

相关文章:

sql-server - SQL Server 到服务总线

TSQL 在 tsql 中声明一个变量而不显式定义列

sql - 如何在 T-SQL 中的位字段上创建三元条件

sql - 我可以在 SQL Server 2012 中的多个列上创建索引吗?

sql - 在 SQL Server 中将 varchar 转换为日期

sql - Top 1 如何在 sql server 2012 中工作

sql - 重复计数 - SQL

sql-server - 如何在存储过程中设置锁?

c# - Ado.net 从多线程调用存储过程比单线程慢

sql - 每个外键的索引?