我正在使用 Visual Studio 2015,并且我的 SQL Server 数据库项目中的 STRING_AGG Within GROUP 出现问题。
SELECT [Continent],
STRING_AGG([Country], ', ') WITHIN GROUP (ORDER BY [Country]) AS CountryList
FROM [Country]
GROUP BY [Continent]
此代码给出错误 SQL46010: AS 附近的语法不正确。 没有
WITHIN GROUP (ORDER BY [Country])
没问题。
目标平台设置为
Microsoft Azure SQL Database V12
调试目标连接设置为本地 SQL Server vNext 数据库。
在 SQL Server Management Studio 中,这段代码执行没有任何问题。在 SSMS 中或从代码运行存储过程会给出预期的正确结果(每个大洲 1 行,每个大洲的国家/地区列表,以逗号分隔,按国家/地区排序)。
同时,我安装了 Visual Studio 2017,希望这能消除错误,但没有成功。
已安装 SQL Server Data Tools 17(内部版本 14.0.61704.140)。
我遇到了类似的问题并怀疑这可能是兼容性问题,因为以下内容为我进行了排序。我没有意识到每个 SQL Server 数据库都有自己的 COMPATIBILITY_LEVEL,这会影响数据库的工作方式。 https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-2017 解释如何查询和更改此数据库属性。
SELECT NAME, COMPATIBILITY_LEVEL FROM sys.databases;
显示我的数据库的 COMPATIBILITY_LEVEL 为 100(即它与 SQL Server 2008 兼容)。
跑步中
ALTER DATABASE <DATABASE_NAME>
SET COMPATIBILITY_LEVEL = 110
(或 120 或 130),因此它现在与 SQL Server 2012+ 兼容,包含 STRING_AGG 函数的WITHIN GROUP 子句的查询开始工作。
关于兼容性级别需要注意的另一件事,如果您的数据库处于比 SQL 安装更早的兼容性级别并且您不想更改它,您可以只从 master 运行查询并使用到您要查询的数据库表,它将使用主数据库的兼容级别(即无论 SQL 安装版本是什么)。
例如:
改变:
USE MyDB
GO
SELECT STRING_AGG(MyNames, ',') FROM dbo.MyTable
致:
USE Master
GO
SELECT STRING_AGG(MyNames, ',') FROM MyDB.dbo.MyTable
问题
当我尝试在 Visual Studio 2017 中构建数据库项目时,出现如下错误:
“')'附近有语法错误”。这是在我使用
STRING_AGG()
子句时实现 WITHIN GROUP()
后出现的。
解决方案
我通过在 Visual Studio 中的“项目 --> “属性”下更改目标平台解决了这个问题。
将其更改为 SQL Server 2017,现在我的数据库项目构建没有错误。似乎 Visual Studio 2017 的默认目标平台是 SQL Server 2016。