【问题标题】:Compatibility mode allows new command?兼容模式允许新命令?
【发布时间】:2018-08-22 21:15:32
【问题描述】:

我有一个 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 应该将较新的语句视为非法的实际情况?
  • @MarcusViniciusPompeu,我们最近将所有服务器升级到 2017。我们每天都在 2017 模式下开发,但应用程序仍在 2012 模式下运行,直到我们确信可以将其切换到 2017 模式。一位开发人员正在使用 STRING_AGG(),因为带有 STUFF() 的 XML 非常笨重。我说它可以在我们的开发环境中工作,但在生产环境中会失败。我用上面的代码测试了它,它工作正常。我找不到任何记录在旧兼容模式下工作的新功能的任何内容,所以我在这里。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 自 SQL 2016 以来,兼容性级别的进一步目标是模拟旧版本的查询优化器行为。所以不仅意义,而且语句的表现应该是一样的。
猜你喜欢
  • 1970-01-01
  • 2011-12-31
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多