Recherche…


Syntaxe

  • JSON_VALUE (expression, path) - extrait une valeur scalaire d'une chaîne JSON.
  • JSON_QUERY (expression [, chemin]) - Extrait un objet ou un tableau d'une chaîne JSON.
  • OPENJSON (jsonExpression [, chemin]) - fonction table-valeur qui analyse le texte JSON et renvoie les objets et propriétés dans JSON sous forme de lignes et de colonnes.
  • ISJSON (expression) - Vérifie si une chaîne contient un JSON valide.
  • JSON_MODIFY (expression, path, newValue) - Met à jour la valeur d'une propriété dans une chaîne JSON et renvoie la chaîne JSON mise à jour.

Paramètres

Paramètres Détails
expression Généralement, le nom d'une variable ou d'une colonne contenant du texte JSON.
chemin Une expression de chemin JSON qui spécifie la propriété à mettre à jour. path a la syntaxe suivante: [append] [lax | strict] $. <chemin json>
jsonExpression Est une expression de caractère Unicode contenant le texte JSON.

Remarques

La fonction OPENJSON est uniquement disponible sous le niveau de compatibilité 130. Si le niveau de compatibilité de votre base de données est inférieur à 130, SQL Server ne pourra pas trouver et exécuter la fonction OPENJSON. Actuellement, toutes les bases de données SQL Azure sont définies sur 120 par défaut. Vous pouvez modifier le niveau de compatibilité d'une base de données à l'aide de la commande suivante:

ALTER DATABASE <Database-Name-Here> SET COMPATIBILITY_LEVEL = 130

Formater les résultats de la requête en tant que JSON avec FOR JSON

Données de la table d'entrée (table People)

Id prénom Âge
1 John 23
2 Jeanne 31

Question

SELECT Id, Name, Age
FROM People
FOR JSON PATH

Résultat

[
    {"Id":1,"Name":"John","Age":23},
    {"Id":2,"Name":"Jane","Age":31}
]

Parse JSON text

Les fonctions JSON_VALUE et JSON_QUERY analysent le texte JSON et renvoient des valeurs scalaires ou des objets / tableaux sur le chemin du texte JSON.

DECLARE @json NVARCHAR(100) = '{"id": 1, "user":{"name":"John"}, "skills":["C#","SQL"]}'

SELECT
    JSON_VALUE(@json, '$.id') AS Id,
    JSON_VALUE(@json, '$.user.name') AS Name,
    JSON_QUERY(@json, '$.user') AS UserObject,
    JSON_QUERY(@json, '$.skills') AS Skills,
    JSON_VALUE(@json, '$.skills[0]') AS Skill0

Résultat

Id prénom UserObject Compétences Compétence0
1 John {"name": "John"} ["C #", "SQL"] C #

Joindre des entités JSON parent et enfant à l'aide de CROSS APPLY OPENJSON

Joindre des objets parents avec leurs entités enfants, par exemple, nous voulons une table relationnelle de chaque personne et de ses loisirs

DECLARE @json nvarchar(1000) =
N'[
    {
        "id":1,
        "user":{"name":"John"},
        "hobbies":[
            {"name": "Reading"},
            {"name": "Surfing"}
        ]
    },
    {
        "id":2,
        "user":{"name":"Jane"},
        "hobbies":[
            {"name": "Programming"},
            {"name": "Running"}
        ]
    }
 ]'

Question

SELECT 
    JSON_VALUE(person.value, '$.id') as Id,
    JSON_VALUE(person.value, '$.user.name') as PersonName,
    JSON_VALUE(hobbies.value, '$.name') as Hobby
FROM OPENJSON (@json) as person
    CROSS APPLY OPENJSON(person.value, '$.hobbies') as hobbies

Cette requête peut également être écrite à l'aide de la clause WITH.

SELECT 
    Id, person.PersonName, Hobby
FROM OPENJSON (@json)
WITH(
    Id int '$.id',
    PersonName nvarchar(100) '$.user.name',
    Hobbies nvarchar(max) '$.hobbies' AS JSON
) as person
CROSS APPLY OPENJSON(Hobbies)
WITH(
    Hobby nvarchar(100) '$.name'
)

Résultat

Id Nom d'une personne Loisir
1 John En train de lire
1 John Surfant
2 Jeanne La programmation
2 Jeanne Fonctionnement

Index sur les propriétés JSON en utilisant des colonnes calculées

Lors du stockage de documents JSON dans SQL Server, nous devons pouvoir filtrer et trier efficacement les résultats des requêtes sur les propriétés des documents JSON.

CREATE TABLE JsonTable
(
    id int identity primary key,
    jsonInfo nvarchar(max),
    CONSTRAINT [Content should be formatted as JSON]
    CHECK (ISJSON(jsonInfo)>0)
)
INSERT INTO JsonTable
VALUES(N'{"Name":"John","Age":23}'),
(N'{"Name":"Jane","Age":31}'),
(N'{"Name":"Bob","Age":37}'),
(N'{"Name":"Adam","Age":65}')
GO

Étant donné le tableau ci-dessus Si nous voulons trouver la ligne avec le nom = 'Adam', nous exécuterons la requête suivante.

SELECT * 
FROM JsonTable Where 
JSON_VALUE(jsonInfo, '$.Name') = 'Adam'

Cependant, cela nécessitera que SQL Server exécute une table complète qui, sur une grande table, n'est pas efficace.

Pour accélérer cela, nous aimerions ajouter un index, mais nous ne pouvons pas référencer directement les propriétés dans le document JSON. La solution consiste à ajouter une colonne calculée sur le chemin JSON $.Name , puis à ajouter un index sur la colonne calculée.

ALTER TABLE JsonTable
ADD vName as JSON_VALUE(jsonInfo, '$.Name')

CREATE INDEX idx_name
ON JsonTable(vName)

Maintenant, lorsque nous exécutons la même requête, au lieu d'une analyse de table complète, SQL Server utilise un index pour rechercher dans l'index non clusterisé et rechercher les lignes qui répondent aux conditions spécifiées.

Remarque: Pour que SQL Server utilise l'index, vous devez créer la colonne calculée avec la même expression que celle que vous prévoyez d'utiliser dans vos requêtes - dans cet exemple, JSON_VALUE(jsonInfo, '$.Name') . Cependant, vous pouvez également utiliser le nom de la colonne calculée vName

Mettre en forme une ligne de tableau en tant qu'objet JSON unique à l'aide de FOR JSON

L' option WITHOUT_ARRAY_WRAPPER de la clause FOR JSON supprime les crochets de tableau de la sortie JSON. Ceci est utile si vous retournez une seule ligne dans la requête.

Remarque: cette option produira une sortie JSON non valide si plusieurs lignes sont renvoyées.

Données de la table d'entrée (table People)

Id prénom Âge
1 John 23
2 Jeanne 31

Question

SELECT Id, Name, Age
FROM People
WHERE Id = 1
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

Résultat

{"Id":1,"Name":"John","Age":23}

Analyser le texte JSON en utilisant la fonction OPENJSON

La fonction OPENJSON analyse le texte JSON et renvoie plusieurs sorties. Les valeurs à renvoyer sont spécifiées à l'aide des chemins définis dans la clause WITH. Si aucun chemin n'est spécifié pour une colonne, le nom de la colonne est utilisé comme chemin. Cette fonction renvoie les valeurs aux types SQL définis dans la clause WITH. L'option AS JSON doit être spécifiée dans la définition de la colonne si un objet / tableau doit être renvoyé.

DECLARE @json NVARCHAR(100) = '{"id": 1, "user":{"name":"John"}, "skills":["C#","SQL"]}'

SELECT * 
FROM OPENJSON (@json)
    WITH(Id int '$.id',
        Name nvarchar(100) '$.user.name',
        UserObject nvarchar(max) '$.user' AS JSON,
        Skills nvarchar(max) '$.skills' AS JSON,
        Skill0 nvarchar(20) '$.skills[0]')

Résultat

Id prénom UserObject Compétences Compétence0
1 John {"name": "John"} ["C #", "SQL"] C #


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow