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的主要内容,如果未能解决你的问题,请参考以下文章
新的 DBProject 创建说项目类型不可用,即使安装了 SSDT