2016-07-09 2 views
5

का उपयोग कर SQL सर्वर 2016 में JSON ऐरे तक पहुंचने से मैं नए परिचय वाले JSON_VALUE फ़ंक्शन का उपयोग करके जेसन के अंदर सरणी एक्सेस करते समय अटक गया हूं। कृपया कोड को अपनाने पर विचार -JSON_VALUE

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='JsonData') 
    DROP TABLE JsonData; 
go 

CREATE TABLE JsonData(JsonData nvarchar(max)); 
DECLARE @SQL nvarchar(max); 
DECLARE @Table AS TABLE(JsonPath VARCHAR(256)); 

INSERT INTO JsonData(JsonData) 
VALUES(
'{ 
    "firstName": "John", 
    "lastName" : "doe", 
    "age"  : 26, 
    "address" : { 
    "streetAddress": "naist street", 
    "city"   : "Nara", 
    "postalCode" : "630-0192" 
    }, 
    "phoneNumbers": [ 
    { 
     "type" : "iPhone", 
     "number": "0123-4567-8888" 
    }, 
    { 
     "type" : "home", 
     "number": "0123-4567-8910" 
    } 
    ] 
}') 


INSERT INTO @Table 
SELECT VALUE FROM OPENJSON('{ 
"Path1":"$.firstName","Path2":"$.phoneNumbers[:1].number" 
}') ; 

SELECT @SQL=(SELECT 'UNION SELECT '''+ CAST(JsonPath AS VARCHAR(256)) +''',JSON_VALUE(JsonData,'''+a.JsonPath+''') 
        FROM JsonData a'        
        FROM @Table a  
     FOR XML PATH(''), TYPE) 
    .value('.','NVARCHAR(MAX)') 
FROM @Table t; 

SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5) 

PRINT @SQL  

EXEC SP_EXECUTESQL @SQL; 

यहाँ अगर मैं विशिष्ट फोन तो संख्या इस नोड काम नहीं कर रहा तक पहुँचने के सामान्य वाक्य रचना का उपयोग करना चाहते हैं। मैं इस मामले

JSON path is not properly formatted. Unexpected character ':' is found at position 15. 

हालांकि में निम्न त्रुटि हो रही है जब मैं http://jsonpath.com पर जाँच की है, मैं मान प्राप्त करने में सक्षम हूँ। क्या SQL सर्वर 2016 JSON मानों तक पहुंचने के लिए कुछ अलग वाक्यविन्यास का उपयोग करता है?

+0

यह वह जगह है विषय से हटकर लेकिन know.You लिए उपयोगी हो सकता है ड्रॉप टेबल का उपयोग कर सकते हैं अगर EXSSTS JsonData अगर (ड्रॉप) ड्रॉप टेबल के बजाय .... –

+0

सहमत हैं, पुरानी आदतें मरती हैं :-) –

उत्तर

4

PHONENUMBERS से सभी प्राप्त करने के लिए:

DECLARE @json nvarchar(max)= 
    '{ 
     "firstName": "John", 
     "lastName" : "doe", 
     "age"  : 26, 
     "address" : { 
     "streetAddress": "naist street", 
     "city"   : "Nara", 
     "postalCode" : "630-0192" 
     }, 
     "phoneNumbers": [ 
     { 
      "type" : "iPhone", 
      "number": "0123-4567-8888" 
     }, 
     { 
      "type" : "home", 
      "number": "0123-4567-8910" 
     } 
     ] 
    }' 

    SELECT [Type], [Number] 
    FROM OPENJSON(@json, '$.phoneNumbers') 
    WITH ([Type] NVARCHAR(25) '$.type', [Number] NVARCHAR(25) '$.number'); 
+0

धन्यवाद फिर से! ऐसा लगता है कि यह निकटतम है मैं प्राप्त कर सकता हूं। अगर मुझे जेएसओएन की सटीक संरचना नहीं पता है तो आपके पास बहुत सारे बदलाव होंगे, लेकिन आपके सुझावों ने मुझे सही दिशा में मदद की है। मैं सामान्य समाधान बनाना चाहता हूं। मेरी इच्छा है कि भविष्य के अपडेट उचित JSON ट्रैवर्सिंग का समर्थन कर सकें। –

2

SQL सर्वर 2016 JSON का समर्थन करता है। यह लगभग समान है, लगभग समान है। आप अपनी खुद की तुलना करेंगे।

तुम एक अस्थायी चर @Table का उपयोग और उसके बाद जोड़तोड़ बनाने की जरूरत नहीं है ...

आप निम्नलिखित क्वेरी का उपयोग करके Microsoft के इन आधिकारिक लिंक, JSON समर्थन के बारे में चलाने के

SELECT JSON_VALUE(JsonData, '$.phoneNumbers[0].type') AS [PhoneType], 
     JSON_VALUE(JsonData, '$.phoneNumbers[0].number') AS [PhoneNumber] 
FROM JsonData 
WHERE ISJSON(JsonData) > 0; 
--iPhone 0123-4567-8888 

SELECT JSON_VALUE(JsonData, '$.phoneNumbers[1].type') AS [PhoneType], 
     JSON_VALUE(JsonData, '$.phoneNumbers[1].number') AS [PhoneNumber] 
FROM JsonData 
WHERE ISJSON(JsonData) > 0; 
--home 0123-4567-8910 

चेक

https://msdn.microsoft.com/en-us/library/dn921897.aspx

https://msdn.microsoft.com/en-us/library/dn921898.aspx

: अधिक जानकारी के लिए
+0

हाय, मदद के लिए धन्यवाद! मुझे @table variable की आवश्यकता है क्योंकि मेरे मूल समाधान को पैरामीटर की आवश्यकता है जिसमें ऐप किसी भी JSON पथ को पास कर सकता है। उस पारित पथ के खिलाफ डेटा एक (बहु) जटिल JSON से वापस किया जाना चाहिए। यह एक सरलीकृत उदाहरण है और अगर सरणी तर्क के रूप में प्रदान की जाती है तो मुझे मूल रूप से सभी तत्वों को वापस करने की आवश्यकता होती है। उदाहरण के लिए, $ .phoneNumbers [:]। संख्या उस सरणी में सभी संख्याओं को वापस करनी चाहिए। –

+0

अहम, तो आप समाधान के बहुत करीब हैं। जब आप अपनी क्वेरी में कोशिश कर रहे हैं तो मैं एक गतिशील एसक्यूएल क्वेरी में उपरोक्त प्रश्न (या पथ) का उपयोग करूंगा। पता है कि $ .phoneNumbers [:] टी-एसक्यूएल जेएसओएन वास्तव में $ .phoneNumbers [*] –

+0

फिर से धन्यवाद! जब मैंने * - संदेश 13607, स्तर 16, राज्य 4, रेखा 4 JSON पथ का उचित रूप से स्वरूपित नहीं किया है, तो मुझे निम्न त्रुटि मिली। अप्रत्याशित चरित्र '*' स्थिति 15 पर पाया जाता है। यदि आप मुझे "टीएसक्यूएल जेएसओएन" समझाते हुए किसी भी लिंक पर इंगित कर सकते हैं जो वास्तव में सहायक होगा। मुझे ऐसा कोई संदर्भ नहीं मिला –

2

आप उपयोग कर सकते हैं "क्रॉस लागू करें" firstName साथ फोन नंबर प्राप्त करने के लिए:

SELECT JSON_VALUE (jsonData, '$.firstName'),p.* 
    FROM JsonData 
    CROSS APPLY 
    OPENJSON (JsonData, '$.phoneNumbers') WITH(type varchar(10) '$.type', number varchar (30) '$.number') p 
संबंधित मुद्दे