Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 兼容模式允许新命令吗?_Sql Server_Tsql_Sql Server 2012_Sql Server 2017 - Fatal编程技术网

Sql server 兼容模式允许新命令吗?

Sql server 兼容模式允许新命令吗?,sql-server,tsql,sql-server-2012,sql-server-2017,Sql Server,Tsql,Sql Server 2012,Sql Server 2017,我有一台SQL Server 2017服务器,在2012兼容模式下运行数据库。但是,当我尝试使用新的to 2017 T-SQL命令string\u agg()时,它是有效的。我预计会出现语法错误,因为string\u agg()对2012模式无效 下面是我正在使用的SQL: SELECT Compatibility_Level, CASE Compatibility_Level WHEN 65 THEN 'SQL Server 6.5' WHEN 70

我有一台SQL Server 2017服务器,在2012兼容模式下运行数据库。但是,当我尝试使用新的to 2017 T-SQL命令
string\u agg()
时,它是有效的。我预计会出现语法错误,因为
string\u 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

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

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

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


为什么??考虑升级。您首先希望将所有内容转换为新的语法和函数,然后当您对所有内容都准备就绪感到满意时,您可以提高兼容性级别。如果您不能允许在新的兼容级别中有效(但以前无效或无意义),则很难迁移到更高的级别。

自SQL 2016以来,兼容级别的另一个目标是模拟旧版本的查询优化器行为。因此,不仅仅是含义,而且语句的性能应该是一样的。您是否只是困惑了SQL Server并不像您预期的那样表现,或者当您的SQL Server在COMPATE模式开启时应该认为新的语句是非法的吗?@ MarcusViniciusPompeu,我们最近将所有服务器升级到2017。我们每天都在2017模式下开发,但应用程序仍在2012模式下运行,直到我们有信心将其切换到2017模式。一位开发人员使用了STRING_AGG(),因为带有STUFF()的XML太笨重了。我说过它可以在我们的开发环境中工作,但在生产中会失败。我用上面的代码对它进行了测试,结果成功了。我找不到任何记录在旧兼容模式下工作的新特性的文档,所以我在这里。
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)