2016-07-14 11 views
2

Ich versuche, Daten aus dem JSON-Format in SQl Server zu verschieben. Ich verwende SQL Server 2016, da diese Edition das Importieren von JSON-Daten mit OPENROWSET unterstützt.Wie Laden von JSON aus Datei in SQL Server 2016?

Ich benutze die unten, um die Daten abzufragen/zu importieren, aber ich brauche etwas Hilfe beim Parsen des Inhalts. Unten ist meine Abfrage und die JSON-Beispieldatei, die ich versuche, in die DB zu verschieben.

Abfrage

SELECT value 
FROM OPENROWSET (BULK 'C:\temp\temp.json', SINGLE_CLOB) as j 
CROSS APPLY OPENJSON(BulkColumn) 

für die oben, im immer Ergebnisse in 2 Reihen, wo meine erste Reihe einige Informationen, die ich brauche nicht. Ich würde gerne wissen, wie ich meine zweite Reihe nur auswählen könnte.

Hier ist die JSON-Datei

{ 
    "meta": { 
    "disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.", 
    "terms": "https://open.fda.gov/terms/", 
    "license": "https://open.fda.gov/license/", 
    "last_updated": "2016-05-28", 
    "results": { 
     "skip": 0, 
     "limit": 1, 
     "total": 1540390 
    } 
    }, 


    "results": [ 
    { 
     "manufacturer_contact_zip_ext": "", 
     "manufacturer_g1_address_2": "", 
     "event_location": "", 
     "report_to_fda": "Y", 
     "manufacturer_contact_t_name": "", 
     "manufacturer_contact_state": "", 
     "manufacturer_link_flag": "Y", 
     "manufacturer_g1_city": "ZUG", 
     "manufacturer_contact_address_2": "", 
     "event_type": "Malfunction", 
     "manufacturer_contact_pcity": "", 
     "manufacturer_contact_address_1": "GUBELSTRASSE 34", 
     "report_number": "3008382007-2012-09245", 
     "type_of_report": [ 
     "Initial submission" 
     ], 
     "product_problem_flag": "Y", 
     "date_received": "20130101", 
     "manufacturer_address_2": "", 
     "reprocessed_and_reused_flag": "N", 
     "manufacturer_address_1": "", 
     "manufacturer_contact_zip_code": "6300", 
     "manufacturer_contact_plocal": "", 
     "reporter_occupation_code": "PATIENT", 
     "manufacturer_contact_l_name": "WANDOLSKI", 
     "source_type": [ 
     "Consumer" 
     ], 
     "distributor_zip_code_ext": "", 
     "manufacturer_g1_postal_code": "6300", 
     "manufacturer_g1_state": "", 
     "date_facility_aware": "20121210", 
     "manufacturer_contact_area_code": "", 
     "manufacturer_contact_f_name": "YANNICK", 
     "previous_use_code": "I", 
     "device": [ 
     { 
      "manufacturer_d_address_1": "GUBELSTRASSE 34", 
      "manufacturer_d_address_2": "", 
      "device_event_key": "", 
      "device_sequence_number": " 1.0", 
      "manufacturer_d_state": "", 
      "manufacturer_d_zip_code": "6300", 
      "manufacturer_d_city": "ZUG", 
      "lot_number": "3180296", 
      "manufacturer_d_postal_code": "6300", 
      "manufacturer_d_zip_code_ext": "", 
      "model_number": "", 
      "date_received": "20130101", 
      "device_report_product_code": "NBW", 
      "device_operator": "LAY USER/PATIENT", 
      "device_availability": "No", 
      "other_id_number": "", 
      "generic_name": "GLUCOSE MONITORING SYS/KIT", 
      "manufacturer_d_name": "LIFESCAN EUROPE, A DIVISION OF CILAG GMBH INTL", 
      "manufacturer_d_country": "SZ", 
      "brand_name": "OT ULTRALINK METER", 
      "openfda": { 
      "device_name": "System, Test, Blood Glucose, Over The Counter", 
      "medical_specialty_description": "Clinical Chemistry", 
      "device_class": "2", 
      "regulation_number": "862.1345" 
      }, 
      "device_age_text": "", 
      "device_evaluated_by_manufacturer": "R", 
      "catalog_number": "", 
      "implant_flag": "", 
      "date_removed_flag": "" 
     } 
     ], 
     "manufacturer_zip_code": "", 
     "manufacturer_contact_country": "SZ", 
     "health_professional": "N", 
     "manufacturer_g1_zip_code_ext": "", 
     "manufacturer_city": "", 
     "manufacturer_contact_extension": "", 
     "manufacturer_contact_phone_number": "", 
     "patient": [ 
     { 
      "sequence_number_treatment": [ 
      "" 
      ], 
      "patient_sequence_number": "1", 
      "date_received": "20130101", 
      "sequence_number_outcome": [ 
      "" 
      ] 
     } 
     ], 
     "distributor_city": "", 
     "distributor_state": "", 
     "date_report": "20121210", 
     "initial_report_to_fda": "Unknown", 
     "manufacturer_g1_country": "SZ", 
     "event_key": "", 
     "manufacturer_contact_city": "ZUG", 
     "mdr_report_key": "2891923", 
     "removal_correction_number": "", 
     "number_devices_in_event": "", 
     "date_manufacturer_received": "20121210", 
     "manufacturer_name": "", 
     "report_source_code": "Manufacturer report", 
     "remedial_action": [ 
     "" 
     ], 
     "manufacturer_g1_zip_code": "6300", 
     "manufacturer_zip_code_ext": "", 
     "report_to_manufacturer": "", 
     "manufacturer_g1_name": "LIFESCAN EUROPE, A DIVISION OF CILAG GMBH INTL", 
     "distributor_address_1": "", 
     "adverse_event_flag": "N", 
     "manufacturer_state": "", 
     "distributor_address_2": "", 
     "manufacturer_postal_code": "", 
     "manufacturer_country": "", 
     "single_use_flag": "N", 
     "mdr_text": [ 
     { 
      "mdr_text_key": "16750885", 
      "text_type_code": "Description of Event or Problem", 
      "patient_sequence_number": "1", 
      "text": "ON (B)(6) 2012, THE LAY USER/ PATIENT CONTACTED LIFESCAN (LFS) IN USA ALLEGING AN ER 2 ISSUE. THE PATIENT DID NOT ALLEGE ANY HARM OR INJURY DUE TO THE ALLEGED ISSUE. THE ALLEGED ISSUE WAS NOT RESOLVED WITH TROUBLESHOOTING. BASED ON THE INFORMATION PROVIDED, THERE IS NO INDICATION THAT THE REPORTED ISSUE CAUSED OR CONTRIBUTED TO A SERIOUS INJURY. THE PATIENT DID NOT DEVELOP SYMPTOMS SUGGESTIVE OF SEVERE HYPOGLYCEMIA OR HYPERGLYCEMIA, NOR RECEIVE MEDICAL INTERVENTION FOR EITHER OF THESE CONDITIONS. HOWEVER, THIS COMPLAINT IS BEING REPORTED BECAUSE THE ALLEGED PRODUCT ISSUE REMAINED UNRESOLVED." 
     } 
     ], 
     "number_patients_in_event": "", 
     "distributor_name": "", 
     "manufacturer_g1_address_1": "GUBELSTRASSE 34", 
     "distributor_zip_code": "", 
     "manufacturer_contact_exchange": "", 
     "manufacturer_contact_postal_code": "6300", 
     "manufacturer_contact_pcountry": "" 
    } 
    ] 
} 

Antwort

4

Wenn Sie sagen, „zweite Reihe“ ist, nehme ich an, dass Sie Daten in „Ergebnisse“ Objekt soll. OPENJSON gibt eine Zeile für jede Taste zurück: Wertpaar, das in der Eingabe gefunden wird (nur auf der ersten Ebene des Eingabeobjekts). In Ihrem Fall haben Sie zwei Objekte, eines unter "Meta" und das andere unter "Ergebnisse".

Sie können zweite Reihe Filter [key] Säule:

SELECT value 
FROM OPENROWSET (BULK 'C:\temp\temp.json', SINGLE_CLOB) as j 
CROSS APPLY OPENJSON(BulkColumn) 
WHERE [key] = 'results' 

Oder Sie können in JSON auf Pfad $ .RESULT suchen und alle Knoten innerhalb dieses Objekt erhalten:

SELECT value 
FROM OPENROWSET (BULK 'C:\temp\temp.json', SINGLE_CLOB) as j 
CROSS APPLY OPENJSON(BulkColumn, '$.results') 

Sie Vielleicht Schauen Sie sich auch das Schema OPENJSON WITH an, mit dem Sie Knoten im JSON-Objekt als Zellen transformieren können, z. B .:

SELECT * 
FROM OPENROWSET (BULK 'C:\temp\temp.json', SINGLE_CLOB) as j 
CROSS APPLY OPENJSON(BulkColumn, '$.results') 
WITH (report_number nvarchar(400), date_received nvarchar(400),device nvarchar(max) AS JSON) 

Wenn Sie NVARCHAR (MAX) AS JSON als Rückgabetyp angeben, können Sie ein JSON-Fragment extrahieren (z. Geräte-Array in Ihrem Beispiel).

SELECT * 
FROM OPENROWSET (BULK 'C:\temp\temp.json', SINGLE_CLOB) as j 
CROSS APPLY OPENJSON(BulkColumn, '$.results') 
WITH (report_number nvarchar(400), date_received nvarchar(400),device nvarchar(max) AS JSON) 
    CROSS APPLY OPENJSON(device) WITH (lot_number int) 
+0

Dank und das ist genau das, was ich suche: Wenn Sie ein paar Informationen von der inneren Anordnung (zB Gerät), dann können Sie mit dem zweiten OPENJSON und nimmt Info JSON-Array aus innerer Tabelle, zum Beispiel öffnen, dass zum ! Aber wie kann ich Daten für geschachtelte Spalten anfordern, Beispiel: Wenn ich nur "lotnumber" von "Gerät" Informationen aus dem obigen JSON – RData

+0

brauche, habe ich die Antwort mit neuen Beispielen aktualisiert. Ich hoffe, dass Sie das brauchen. –

+0

Yup! Nochmals vielen Dank – RData