2017-10-09 3 views
0

Je suis allé en arrière et en avant sur ce point, mais perplexe. J'ai un fichier qui a plusieurs lignes JSON dans plusieurs objets.Lignes Json (fichier .jsonl) & SQL Server 2016

J'ai mis deux lignes ci-dessous.

{ 
    "mental_health_act_legal_status": 
    [ 
     {"legal_status_classification": "16", "start_time": "16:32", "expiry_date": "20171014", "expiry_time": "20:28", "start_date": "20170912"}, 
     {"legal_status_classification": "07", "start_time": "01:31", "expiry_date": "20170922", "expiry_time": "17:53", "start_date": "20170820"}, 
     {"legal_status_classification": "36", "start_time": "00:25", "expiry_date": "20170909", "expiry_time": "18:08", "start_date": "20170801"}, 
     {"legal_status_classification": "18", "start_time": "18:26", "expiry_date": "20170801", "expiry_time": "12:40", "start_date": "20170724"}, 
     {"legal_status_classification": "18", "start_time": "10:26", "expiry_date": "20170801", "expiry_time": "03:07", "start_date": "20170623"}, 
     {"legal_status_classification": "18", "start_time": "04:11", "expiry_date": "20170621", "expiry_time": "12:51", "start_date": "20170601"}, 
     {"legal_status_classification": "17", "start_time": "07:54", "expiry_date": "20170605", "expiry_time": "05:04", "start_date": "20170512"}, 
     {"legal_status_classification": "31", "start_time": "02:41", "expiry_date": "20170520", "expiry_time": "11:14", "start_date": "20170920"}, 
     {"legal_status_classification": "03", "start_time": "23:17", "expiry_date": "20170504", "expiry_time": "06:29", "start_date": "20170925"}, 
     {"legal_status_classification": "05", "start_time": "17:41", "expiry_date": "20170403", "expiry_time": "01:23", "start_date": "20170331"}, 
     {"legal_status_classification": "36", "start_time": "05:05", "expiry_date": "20170322", "expiry_time": "14:30", "start_date": "20170312"}, 
     {"legal_status_classification": "03", "start_time": "03:45", "expiry_date": "20170310", "expiry_time": "11:56", "start_date": "20170213"}, 
     {"legal_status_classification": "01", "start_time": "14:03", "expiry_date": "20170201", "expiry_time": "06:02", "start_date": "20170118"}, 
     {"legal_status_classification": "09", "start_time": "07:07", "expiry_date": "20170121", "expiry_time": "22:15", "start_date": "20170111"} 
    ], 
    "system": {"record_id": "1484925971009999954", "provider_record_id": "RTD   0167983  0000046", "sus_version": "20170927072844117", "spell_id": "1484925971009999954"} 
} 
{ 
    "mental_health_act_legal_status": 
    [ 
     {"legal_status_classification": "15", "start_time": "18:51", "expiry_date": "20170919", "expiry_time": "23:04", "start_date": "20170904"}, 
     {"legal_status_classification": "19", "start_time": "06:11", "expiry_date": "20170908", "expiry_time": "09:17", "start_date": "20170818"}, 
     {"legal_status_classification": "15", "start_time": "20:36", "expiry_date": "20170818", "expiry_time": "07:44", "start_date": "20170723"}, 
     {"legal_status_classification": "01", "start_time": "16:12", "expiry_date": "20170809", "expiry_time": "21:25", "start_date": "20170718"}, 
     {"legal_status_classification": "09", "start_time": "06:06", "expiry_date": "20170707", "expiry_time": "18:10", "start_date": "20170615"}, 
     {"legal_status_classification": "07", "start_time": "11:53", "expiry_date": "20170625", "expiry_time": "14:09", "start_date": "20170527"}, 
     {"legal_status_classification": "19", "start_time": "07:13", "expiry_date": "20170529", "expiry_time": "00:39", "start_date": "20170503"}, 
     {"legal_status_classification": "35", "start_time": "16:01", "expiry_date": "20170521", "expiry_time": "07:18", "start_date": "20170912"}, 
     {"legal_status_classification": "35", "start_time": "02:45", "expiry_date": "20170430", "expiry_time": "06:47", "start_date": "20170902"}, 
     {"legal_status_classification": "03", "start_time": "19:51", "expiry_date": "20170410", "expiry_time": "18:46", "start_date": "20170319"}, 
     {"legal_status_classification": "13", "start_time": "20:58", "expiry_date": "20170310", "expiry_time": "10:52", "start_date": "20170220"}, 
     {"legal_status_classification": "02", "start_time": "13:11", "expiry_date": "20170217", "expiry_time": "00:42", "start_date": "20170127"}, 
     {"legal_status_classification": "15", "start_time": "18:23", "expiry_date": "20170209", "expiry_time": "20:03", "start_date": "20170120"}, 
     {"legal_status_classification": "07", "start_time": "00:59", "expiry_date": "20170119", "expiry_time": "12:33", "start_date": "20161231"} 
    ], 
    "system": {"record_id": "1484925971009999916", "provider_record_id": "RTD   0167983  0000084", "sus_version": "20170927072844117", "spell_id": "1484925971009999916"} 
} 

Si j'utilise la syntaxe openjson, je peux l'obtenir pour charger une section que je veux l'une des tables, mais une seule ligne dans le fichier est chargé; mais je dois passer par le fichier entier.

J'ai ensuite regardé un fichier .fmt à partir d'un message here mais d'après ce que je peux dire à partir de l'utilisation de ce point jusqu'à présent, les lignes JSON doivent toutes aller à la même table. Vous ne pouvez pas avoir plusieurs objets allant à plusieurs tables dans la ligne ou il ne sait pas où les diviser.

Mon code pour obtenir cela en SQL, pour deux tables couvrant le système et loi sur la santé mentale statut juridique est:

DECLARE @JSON NVARCHAR(MAX) 

SET @JSON = (SELECT J.* 
      FROM OPENROWSET 
      (BULK 'C:\Users\DACR9\Desktop\ECDS_DATA\emergency_care_report.jsonl', SINGLE_CLOB) 
      AS j) 

SELECT * FROM OPENJSON (@JSON, '$.system') 
    WITH ([SUS_VERSION] VARCHAR (255) '$.sus_verion', 
     [SPELL_ID] VARCHAR (255) '$.spell_id', 
     [RECORD_ID] VARCHAR (255)'$.record_id', 
     [PROVIDER_RECORD_ID] VARCHAR (255) '$.provider_record_id' 
    ) 

SELECT [record_id], [legal_status_classification], [start_date], [start_time], [expiry_date], [expiry_time] 
FROM OPENROWSET (BULK 'C:\Users\DACR9\Desktop\ECDS_DATA\emergency_care_report.jsonl', SINGLE_CLOB) AS j 
CROSS APPLY OPENJSON (BulkColumn, '$.mental_health_act_legal_status') 
WITH (
    [legal_status_classification] VARCHAR (255), 
    [start_time] VARCHAR (255), 
    [expiry_date] VARCHAR (255), 
    [expiry_time] VARCHAR (255), 
    [start_date] VARCHAR (255) 
    ) 
CROSS APPLY OPENJSON (BulkColumn, '$.system') 
WITH (
    [record_id] VARCHAR (255) 
    ) 

Est-on en mesure de fournir des conseils ou de l'aide ou la route à regarder s'il vous plaît .

Merci

+0

Alors .. vous dites le premier 'SELECT * FROM OPENJSON (@JSON, '$ .system') 'ne renvoie que la première ligne? La première chose que je ferais est de vérifier que la variable '@ JSON' contient en effet plusieurs' 'system '':' rows –

+0

Salut Nick. Il contient plusieurs lignes "système". System est la section obligatoire qui doit être présente car elle contient l'ID d'enregistrement généré par le système. Tout est techniquement optionnel, mais pour l'exemple que j'ai ajouté dans MHA. L'ID d'enregistrement est ce qui identifie les lignes MHA à un enregistrement individuel spécifique plutôt que d'être sans identificateur et record_id est le PK dans le bloc système. J'ai copié deux rangs et l'ai coupé juste à MHA et système pour le rendre plus facile à voir. – user1663003

+0

Fondamentalement, rien n'indique que '' system ''est un enregistrement dans un tableau. Ma lecture autour de 'OPENJSON' indique que vous ne pouvez obtenir plusieurs enregistrements de tableaux JSON. Les tableaux JSON sont dans ce format: '[{une chose}, {autre chose}, {une autre}]'. Évidemment, vous n'avez pas le choix de changer le format de ce fichier. J'ai édité ma réponse ci-dessous. Ce n'est peut-être pas la fin, mais les échantillons semblent indiquer que c'est le format requis. –

Répondre

0

Je ne pense pas que ce soit « bien formé JSON » - ne devrait pas y avoir une virgule à la fin si la première ligne? et ne devrait-il pas être entouré de crochets? Quelque chose a-t-il généré ce JSON?

Si vous jetez un oeil à l'échantillon soulevé d'ici: https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql vous pouvez voir que plusieurs enregistrements de commande contenus dans les accolades sont séparés par des virgules et entourés par des crochets

DECLARE @json NVARCHAR(MAX) = N'[ 
    { 
    "Order": { 
     "Number":"SO43659", 
     "Date":"2011-05-31T00:00:00" 
    }, 
    "AccountNumber":"AW29825", 
    "Item": { 
     "Price":2024.9940, 
     "Quantity":1 
    } 
    }, 
    { 
    "Order": { 
     "Number":"SO43661", 
     "Date":"2011-06-01T00:00:00" 
    }, 
    "AccountNumber":"AW73565", 
    "Item": { 
     "Price":2024.9940, 
     "Quantity":3 
    } 
    } 
]' 

SELECT * 
FROM OPENJSON (@json) 
WITH ( 
       Number varchar(200) '$.Order.Number', 
       Date  datetime  '$.Order.Date', 
       Customer varchar(200) '$.AccountNumber', 
       Quantity int   '$.Item.Quantity', 
       [Order] nvarchar(MAX) AS JSON 
) 

Vous pouvez pousser les données hors de différentes tables. Ce n'est pas une limitation de OpenJSON, vous avez juste besoin d'utiliser des tables de transfert, etc. pour savoir comment le diviser. Je réalise que ce n'est pas vraiment une réponse mais j'ajouterai plus de détails si vous êtes intéressé.

je peux obtenir plusieurs lignes avec cette syntaxe, mais seulement parce que j'ajouté entre crochets pour un tableau, et de mettre une virgule entre les éléments:

DECLARE @JSON VARCHAR(MAX); 

SET @JSON = ' 
[{ 
    "mental_health_act_legal_status": 
    [ 
     {"legal_status_classification": "16", "start_time": "16:32", "expiry_date": "20171014", "expiry_time": "20:28", "start_date": "20170912"}, 
     {"legal_status_classification": "07", "start_time": "01:31", "expiry_date": "20170922", "expiry_time": "17:53", "start_date": "20170820"}, 
     {"legal_status_classification": "36", "start_time": "00:25", "expiry_date": "20170909", "expiry_time": "18:08", "start_date": "20170801"}, 
     {"legal_status_classification": "18", "start_time": "18:26", "expiry_date": "20170801", "expiry_time": "12:40", "start_date": "20170724"}, 
     {"legal_status_classification": "18", "start_time": "10:26", "expiry_date": "20170801", "expiry_time": "03:07", "start_date": "20170623"}, 
     {"legal_status_classification": "18", "start_time": "04:11", "expiry_date": "20170621", "expiry_time": "12:51", "start_date": "20170601"}, 
     {"legal_status_classification": "17", "start_time": "07:54", "expiry_date": "20170605", "expiry_time": "05:04", "start_date": "20170512"}, 
     {"legal_status_classification": "31", "start_time": "02:41", "expiry_date": "20170520", "expiry_time": "11:14", "start_date": "20170920"}, 
     {"legal_status_classification": "03", "start_time": "23:17", "expiry_date": "20170504", "expiry_time": "06:29", "start_date": "20170925"}, 
     {"legal_status_classification": "05", "start_time": "17:41", "expiry_date": "20170403", "expiry_time": "01:23", "start_date": "20170331"}, 
     {"legal_status_classification": "36", "start_time": "05:05", "expiry_date": "20170322", "expiry_time": "14:30", "start_date": "20170312"}, 
     {"legal_status_classification": "03", "start_time": "03:45", "expiry_date": "20170310", "expiry_time": "11:56", "start_date": "20170213"}, 
     {"legal_status_classification": "01", "start_time": "14:03", "expiry_date": "20170201", "expiry_time": "06:02", "start_date": "20170118"}, 
     {"legal_status_classification": "09", "start_time": "07:07", "expiry_date": "20170121", "expiry_time": "22:15", "start_date": "20170111"} 
    ], 
    "system": {"record_id": "1484925971009999954", "provider_record_id": "RTD   0167983  0000046", "sus_version": "20170927072844117", "spell_id": "1484925971009999954"} 
},{ 
    "mental_health_act_legal_status": 
    [ 
     {"legal_status_classification": "15", "start_time": "18:51", "expiry_date": "20170919", "expiry_time": "23:04", "start_date": "20170904"}, 
     {"legal_status_classification": "19", "start_time": "06:11", "expiry_date": "20170908", "expiry_time": "09:17", "start_date": "20170818"}, 
     {"legal_status_classification": "15", "start_time": "20:36", "expiry_date": "20170818", "expiry_time": "07:44", "start_date": "20170723"}, 
     {"legal_status_classification": "01", "start_time": "16:12", "expiry_date": "20170809", "expiry_time": "21:25", "start_date": "20170718"}, 
     {"legal_status_classification": "09", "start_time": "06:06", "expiry_date": "20170707", "expiry_time": "18:10", "start_date": "20170615"}, 
     {"legal_status_classification": "07", "start_time": "11:53", "expiry_date": "20170625", "expiry_time": "14:09", "start_date": "20170527"}, 
     {"legal_status_classification": "19", "start_time": "07:13", "expiry_date": "20170529", "expiry_time": "00:39", "start_date": "20170503"}, 
     {"legal_status_classification": "35", "start_time": "16:01", "expiry_date": "20170521", "expiry_time": "07:18", "start_date": "20170912"}, 
     {"legal_status_classification": "35", "start_time": "02:45", "expiry_date": "20170430", "expiry_time": "06:47", "start_date": "20170902"}, 
     {"legal_status_classification": "03", "start_time": "19:51", "expiry_date": "20170410", "expiry_time": "18:46", "start_date": "20170319"}, 
     {"legal_status_classification": "13", "start_time": "20:58", "expiry_date": "20170310", "expiry_time": "10:52", "start_date": "20170220"}, 
     {"legal_status_classification": "02", "start_time": "13:11", "expiry_date": "20170217", "expiry_time": "00:42", "start_date": "20170127"}, 
     {"legal_status_classification": "15", "start_time": "18:23", "expiry_date": "20170209", "expiry_time": "20:03", "start_date": "20170120"}, 
     {"legal_status_classification": "07", "start_time": "00:59", "expiry_date": "20170119", "expiry_time": "12:33", "start_date": "20161231"} 
    ], 
    "system": {"record_id": "1484925971009999916", "provider_record_id": "RTD   0167983  0000084", "sus_version": "20170927072844117", "spell_id": "1484925971009999916"} 
}]'; 


SELECT * FROM OPENJSON (@JSON) 
    WITH ([SUS_VERSION] VARCHAR (255) '$.system.sus_verion', 
     [SPELL_ID] VARCHAR (255) '$.system.spell_id', 
     [RECORD_ID] VARCHAR (255)'$.system.record_id', 
     [PROVIDER_RECORD_ID] VARCHAR (255) '$.system.provider_record_id' 
    ); 
+0

Salut Nick. Merci pour votre commentaire. J'ai modifié le message pour utiliser l'une des lignes, mais la nuit dernière, lorsque je postais, je n'avais pas accès, car l'ordinateur portable était épuisé. J'ai aussi ajouté mon script pour sortir certaines pièces, mais j'en écris une pour tout faire. Mon problème est que quand il va au fichier emergency_care.jsonl le SQL ne s'exécute que sur la première ligne qu'il trouve. J'essaie de faire passer toutes les lignes du fichier. Toutes les données de test sont formées pour développer la routine de chargement. Merci. – user1663003