尝试在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,没有任何问题。
传递的想法是将其添加为后期部署脚本,这也不是很好,因为它是一种解决方法而不是解决方案。
答案 0 :(得分:0)
回答可能为时已晚,但当我发现这篇文章时,我遇到了与openjson指令相同的问题,所以这里是我的结果。如果将数据库从Sql Server 2012(例如,不支持openjson)还原到Sql Server 2016中,则兼容级别仍保留在Sql Server 2012中。您必须将数据库(而不是引擎)升级到130级或更高级别:
ALTER DATABASE database_name
SET COMPATIBILITY_LEVEL = 130