【发布时间】: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