SSDT - 交叉应用OPENJSON

时间:2016-06-27 11:55:49

标签: json sql-server-data-tools cross-apply

尝试在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上写这个并执行它,我就没有问题。

我尝试了另一个存储过程,似乎在SSDT中没有OPENJSON。

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

Visual Studio Profesional 2015

版本14.0.25123.00更新2

.NET Framework版本4.6.010555

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

有没有人有任何想法?而不是重构查询以在可能的情况下解决SSDT问题。

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

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

1 个答案:

答案 0 :(得分:0)

回答可能为时已晚,但当我发现这篇文章时,我遇到了与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