2017-08-07 110 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