2017-08-07 111 views
0
declare @Path as nvarchar(100) 
set @path = '$.path.to."sub-object"' 

DECLARE @json NVARCHAR(4000) = N'{ 
     "path": { 
      "to":{ 
       "sub-object":["en-GB", "en-UK","de-AT","es-AR","sr-Cyrl"] 
       } 
       } 
}'; 

SELECT [key], value 
FROM OPENJSON(@json, @Path) 

我得到错误:T-SQL OPENJSON路径变量

Incorrect syntax near '@Path'.

如何声明@path,我可以改变它。

+0

你贴什么我的系统上不报错了。你正在运行什么版本的SQL Server? OPENJSON是2016年的一个特色。 –

+0

真的吗?我使用ms sql 2016服务器 –

回答

2

有趣的是,你看到你正在关注这个链接:https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql

DECLARE @json VARCHAR(4000) = N'{ 
     "path": { 
      "to":{ 
       "sub-object":["en-GB", "en-UK","de-AT","es-AR","sr-Cyrl"] 
       } 
       } 
}'; 

SELECT [key], value 
FROM OPENJSON(@json, '$.path.to."sub-object"') 

当你做出改变一个变量的引用它不:

时在线完成这个工作

declare @Path as nvarchar(128) = '$.path.to."sub-object"' 

DECLARE @json nVARCHAR(4000) = N'{ 
     "path": { 
      "to":{ 
       "sub-object":["en-GB", "en-UK","de-AT","es-AR","sr-Cyrl"] 
       } 
       } 
}'; 

SELECT [key], value 
FROM OPENJSON(@json, @Path) 

更新了黑客的一种,但它的工作原理

declare @Path as nvarchar(128) = '$.path.to."sub-object"' 

DECLARE @json nVARCHAR(4000) = N'{ 
     "path": { 
      "to":{ 
       "sub-object":["en-GB", "en-UK","de-AT","es-AR","sr-Cyrl"] 
       } 
       } 
}'; 

DECLARE @SQL NVARCHAR(MAX) = 
'SELECT [key], value 
FROM OPENJSON(''' + @json + ''', ''' + @Path + ''')' 

EXEC sp_executesql @Sql 
+0

的问题是,如何做第二个例子会工作? –

+0

我可以破解它与动态SQL的工作,但这似乎很愚蠢。必须有更好的方法来做到这一点。它必须是它不喜欢的路径的类型。 – djangojazz

+0

非常感谢django,你很帮我 –

4

将路径作为变量传递给OPENJSON可从SQL Server 2017(又名vNext):

In SQL Server 2017 and in Azure SQL Database, you can provide a variable as the value of path.

declare @Path as nvarchar(100) 
set @path = '$.path.to."sub-object"' 

DECLARE @json NVARCHAR(4000) = N'{ 
     "path": { 
      "to":{ 
       "sub-object":["en-GB", "en-UK","de-AT","es-AR","sr-Cyrl"] 
       } 
       } 
}'; 

SELECT [key], value 
FROM OPENJSON(@json, @Path); 

DbFiddle Demo

+1

感谢上帝,这看起来很短暂,并不是在2016年。 – djangojazz

+1

这真是太好了,谢谢指出!我确实有一个问题,但;在SSMS中,此工作正常,但在Visual Studio中的SQL项目中的存储过程中添加时,它无法识别语法,因此将其标记为错误,从而阻止我构建/部署。还有谁有相同的问题吗?我可能错过了一个附加组件来处理新的语法?我已经更新了我能找到的所有东西。 – vsdev

+0

@vsdev可能不正确[目标平台](http://media.tomaslind.net/2013/11/SSDTProjectSettingsTargetPlatform.jpg)。请检查您的项目属性并设置为SQL Server 2016. – lad2025