2017-08-07 17 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) 

Ich habe Fehler:T-SQL OPENJSON Pfad als Variable

Incorrect syntax near '@Path'.

wie @path zu erklären, dass ich es ändern kann.

+0

Was Sie nicht gepostet nicht auf meinem System Fehler aus. Welche Version von SQL Server führen Sie aus? OPENJSON ist ein 2016 Feature. –

+0

Wirklich? Ich benutze ms sql 2016 Server –

Antwort

2

Interessant es scheint, dass Sie diesem Link folgen: https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql.

Dies funktioniert, wenn Inline getan:

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"') 

Wenn Sie machen die Änderung zu einer Referenz einer Variablen es nicht:

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) 

Art Hack AKTUALISIERT aber es funktioniert

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

die Frage ist, wie das zweite Beispiel würde funktionieren? –

+0

Ich kann es hacken, um mit dynamischen SQL zu arbeiten, aber das scheint albern. Es muss einen besseren Weg geben, dies zu tun. Es muss der Typ sein, den es nicht mag. – djangojazz

+0

Vielen Dank django, Sie haben mir sehr geholfen –

4

Übergeben Pfad als Variable zu OPENJSON ist von SQL Server 2017 (aka 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

Gott sei Dank, das schien lächerlich kurzsichtig es war nicht im Jahr 2016. – djangojazz

+1

Das ist großartig, danke für das darauf hin! Ich habe allerdings ein Problem. In SSMS funktioniert das gut, aber wenn es in einer gespeicherten Prozedur in einem SQL-Projekt in Visual Studio hinzugefügt wird, erkennt es die Syntax nicht, markiert es als einen Fehler und verhindert so, dass ich Build/Deploy. Hat noch jemand dieses Problem? Vermisse ich vielleicht ein Add-on, um mit neuer Syntax umgehen zu können? Ich habe alles aktualisiert, was ich finden kann. – vsdev

+0

@vsdev Wahrscheinlich falsch [Zielplattform] (http://media.tomaslind.net/2013/11/SSDTProjectSettingsTargetPlatform.jpg). Bitte überprüfen Sie Ihre Projekteigenschaften und setzen Sie auf SQL Server 2016. – lad2025