组内和 Visual Studio 中的 STRING_AGG 问题

问题描述 投票:0回答:4

我正在使用 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 visual-studio-2015 azure-sql-database
4个回答
26
投票

我遇到了类似的问题并怀疑这可能是兼容性问题,因为以下内容为我进行了排序。我没有意识到每个 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 子句的查询开始工作。


4
投票

关于兼容性级别需要注意的另一件事,如果您的数据库处于比 SQL 安装更早的兼容性级别并且您不想更改它,您可以只从 master 运行查询并使用到您要查询的数据库表,它将使用主数据库的兼容级别(即无论 SQL 安装版本是什么)。

例如:

改变:

USE MyDB
GO
SELECT STRING_AGG(MyNames, ',') FROM dbo.MyTable 

致:

USE Master
GO
SELECT STRING_AGG(MyNames, ',') FROM MyDB.dbo.MyTable 

2
投票

问题

当我尝试在 Visual Studio 2017 中构建数据库项目时,出现如下错误:

“')'附近有语法错误”。这是在我使用

STRING_AGG()
子句时实现
WITHIN GROUP()
后出现的。

解决方案

我通过在 Visual Studio 中的“项目 --> “属性”下更改目标平台解决了这个问题。

将其更改为 SQL Server 2017,现在我的数据库项目构建没有错误。似乎 Visual Studio 2017 的默认目标平台是 SQL Server 2016。


0
投票

我在使用

STRING_AGG()
WITHIN GROUP()
时遇到了同样的错误:

Incorrect syntax near '('.

这是在 SQL Server 2019 上的

SSMS
v18.5 中完成的,但是...数据库已从使用旧版本 MSSQL 的客户提供的
BAK
中恢复。

尽管有这种不同的旋转,我发现像这里的其他人一样,解决方案是检查并增加

COMPATIBILITY_LEVEL
。这可以通过 UI 轻松完成,如下所示。我只需要将其从 100 更改为 150,就解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.