SSDT - 交叉应用 OPENJSON

Posted

技术标签:

【中文标题】SSDT - 交叉应用 OPENJSON【英文标题】:SSDT - CROSS APPLY OPENJSON 【发布时间】:2016-06-27 11:55:48 【问题描述】:

尝试在 SSDT 中编写存储过程,如下所示:

            CREATE PROCEDURE Response.TransformHotel
                @RequestIDs Request.RequestIDs READONLY
            AS
            BEGIN 
                INSERT INTO response.Hotel
                SELECT EventID, 
                    JSON_VALUE(x.[value], '$.Id') AS HotelID,
                    JSON_VALUE(x.[value], '$.HasSpecialOffer') AS HasSpecialOffer,
                    JSON_VALUE(x.[value], '$.HasClosedUserGroupSpecialOffer') AS HasClosedUserGroupSpecialOffer,
                    JSON_VALUE(x.[value], '$.ReviewSummary.AverageScore') AS AvarageScore,
                    JSON_VALUE(x.[value], '$.PercentageScore') AS PercentageScore,
                    JSON_VALUE(x.[value], '$.NumberOfReviews') AS NumberOfReviews
                FROM Search.[Event] E
                INNER JOIN @RequestIDs R ON R.RequestID = E.EventID
                CROSS APPLY OPENJSON(E.MessageEvent, '$.Response.SearchResults') AS x
            END

但它给了我错误“SQL46010:E 附近的语法不正确。”

但是,如果我在 SSMS 上编写并执行它,我不会遇到任何问题。

我尝试使用另一个存储过程,但似乎 OPENJSON 在 SSDT 中不可用。

            CREATE PROCEDURE Request.TestOpenJSON
            AS
                SELECT * FROM
                OPENJSON( (SELECT E.MessageEvent FROM search.Event E WHERE E.EventID = 1)) 

Visual Studio 专业版 2015

版本 14.0.25123.00 更新 2

.NET 框架版本 4.6.010555

项目设置: 目标平台:SQL Server 2016

有人有什么想法吗?如果可能,不要重构查询来解决 SSDT 问题。

我在整个项目中使用了 JSON VALUE 和 JSON QUERY,没有遇到任何问题。

传递的想法是将其添加为部署后脚本,这也不是很好,因为它是一种变通方法而不是解决方案。

【问题讨论】:

当您转到帮助 - 关于时,您显示哪个版本的 SSDT 已加载? 版本 14.0.60525.0 s32.postimg.org/43tr68251/vs_version.png 绝对是目前的最新版本。我会在 Twitter 上打开 Connect 票证和/或 ping SSDT 团队。是的,您始终可以执行部署后脚本作为解决方法。这并不理想,但至少可以帮助您解决这个特殊问题。 我的项目中也出现了同样的错误。似乎他们还没有为 SSDT 添加对 JSON 的适当支持。 请对相应的 Connect 问题进行投票,以便我们更快地得到修复 - connect.microsoft.com/SQLServer/feedback/details/2820804/… 【参考方案1】:

也许回答太晚了,但是当我找到这篇文章时,我对 openjson 指令有同样的问题,所以这里是我的结果。如果您将数据库从 Sql Server 2012(例如,不支持 openjson)还原到 Sql Server 2016,则兼容性级别仍保留在 Sql Server 2012 中。您必须将数据库(而不是引擎)升级到 130 级或更高级别:

ALTER DATABASE database_name   
SET COMPATIBILITY_LEVEL = 130

https://msdn.microsoft.com/es-es/library/bb510680.aspx

【讨论】:

以上是关于SSDT - 交叉应用 OPENJSON的主要内容,如果未能解决你的问题,请参考以下文章

SSDT HOOK是啥

新的 DBProject 创建说项目类型不可用,即使安装了 SSDT

SSDT Schema Compare 在模式文件中添加空行

Win10中如何枚举所有SSDT

WINDOWS 64位SSDT定位思路

使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]