2016-07-14 5 views
2

J'essaye de déplacer des données du format JSON au serveur SQl. J'utilise SQL Server 2016 comme cette édition prend en charge l'importation de données JSON en utilisant OPENROWSET.Comment charger JSON d'un fichier dans SQL Server 2016?

J'utilise ce qui suit pour interroger/importer les données, mais j'ai besoin d'aide pour analyser le contenu. Voici ma requête et le fichier d'exemple JSON que j'essaie de déplacer vers DB.

Recherche

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

pour ce qui précède, im obtenir des résultats dans 2 rangs où ma première ligne quelques informations que je ne ai pas besoin. Je voudrais savoir, comment serais-je capable de sélectionner seulement ma 2ème rangée.

Voici le fichier JSON

{ 
    "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": "" 
    } 
    ] 
} 

Répondre

4

Quand vous dites « deuxième ligne », je suppose que vous voulez que les données dans l'objet « résultats ». OPENJSON renvoie une ligne pour chaque clé: paire de valeurs trouvée dans l'entrée (uniquement au premier niveau de l'objet d'entrée). Dans votre cas, vous avez deux objets l'un sous la clé "meta", et l'autre sous la clé "résultats".

Vous pouvez filtrer la deuxième ligne à l'aide [key] colonne:

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

Ou vous pouvez chercher dans JSON au chemin .result de $ et obtenez tous les noeuds dans cet objet:

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

Peut-être vous peut également jeter un oeil à OPENJSON WITH schéma qui peut vous aider à transformer des nœuds dans l'objet JSON en tant que cellules, par exemple:

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) 

Si vous spécifiez NVARCHAR (MAX) AS JSON comme type de retour, vous pouvez extraire le fragment JSON (par ex. tableau de périphériques dans votre exemple). Si vous avez besoin d'informations à partir du réseau interne (dispositif par exemple), vous pouvez ouvrir ce tableau JSON avec la deuxième OPENJSON et prendre les informations de la table intérieure, par exemple:

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

Merci et c'est exactement ce que je suis à la recherche pour ! Mais comment puis-je demander des données pour les colonnes imbriquées, par exemple: si je n'ai besoin de "lotnumber" de "périphérique" informations de la JSON ci-dessus – RData

+0

J'ai mis à jour la réponse avec de nouveaux exemples. J'espère que c'est ce dont vous avez besoin. –

+0

Yup! Merci encore – RData