Szukaj…


Składnia

  • JSON_VALUE (wyrażenie, ścieżka) - wyodrębnij wartość skalarną z łańcucha JSON.
  • JSON_QUERY (wyrażenie [, ścieżka]) - Wyodrębnia obiekt lub tablicę z ciągu JSON.
  • OPENJSON (jsonExpression [, ścieżka]) - funkcja tabeli-wartości, która analizuje tekst JSON i zwraca obiekty i właściwości w JSON jako wiersze i kolumny.
  • ISJSON (wyrażenie) - Sprawdza, czy łańcuch zawiera prawidłowy JSON.
  • JSON_MODIFY (wyrażenie, ścieżka, nowaWartość) - aktualizuje wartość właściwości w ciągu JSON i zwraca zaktualizowany ciąg JSON.

Parametry

Parametry Detale
wyrażenie Zazwyczaj nazwa zmiennej lub kolumny zawierającej tekst JSON.
ścieżka Wyrażenie ścieżki JSON, które określa właściwość do aktualizacji. ścieżka ma następującą składnię: [append] [lax | ścisłe] $. <ścieżka jsona>
jsonExpression To wyrażenie znakowe Unicode zawierające tekst JSON.

Uwagi

Funkcja OPENJSON jest dostępna tylko na poziomie zgodności 130. Jeśli poziom zgodności bazy danych jest niższy niż 130, SQL Server nie będzie w stanie znaleźć i wykonać funkcji OPENJSON. Obecnie wszystkie bazy danych Azure SQL są domyślnie ustawione na 120. Możesz zmienić poziom zgodności bazy danych za pomocą następującego polecenia:

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

Sformatuj wyniki zapytania jako JSON za pomocą FOR JSON

Dane tabeli wejściowej (tabela osób)

ID Nazwa Wiek
1 Jan 23
2) Jane 31

Pytanie

SELECT Id, Name, Age
FROM People
FOR JSON PATH

Wynik

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

Analizuj tekst JSON

Funkcje JSON_VALUE i JSON_QUERY analizują tekst JSON i zwracają wartości skalarne lub obiekty / tablice na ścieżce w tekście 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

Wynik

ID Nazwa UserObject Umiejętności Umiejętność 0
1 Jan {„name”: „John”} [„C #”, „SQL”] DO#

Dołącz do nadrzędnych i podrzędnych jednostek JSON za pomocą aplikacji CROSS APPLY OPENJSON

Łącz obiekty nadrzędne z ich bytami potomnymi, na przykład chcemy relacyjnej tabeli każdej osoby i jej hobby

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"}
        ]
    }
 ]'

Pytanie

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

Alternatywnie to zapytanie można napisać przy użyciu klauzuli 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'
)

Wynik

ID Imię osoby Hobby
1 Jan Czytanie
1 Jan Surfing
2) Jane Programowanie
2) Jane Bieganie

Indeksuj właściwości JSON za pomocą kolumn obliczeniowych

Podczas przechowywania dokumentów JSON w SQL Server, musimy mieć możliwość skutecznego filtrowania i sortowania wyników zapytań dotyczących właściwości dokumentów 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

Biorąc pod uwagę powyższą tabelę Jeśli chcemy znaleźć wiersz o nazwie = „Adam”, wykonalibyśmy następujące zapytanie.

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

Wymaga to jednak od serwera SQL wykonania pełnej tabeli, co w przypadku dużej tabeli nie jest skuteczne.

Aby to przyspieszyć, chcielibyśmy dodać indeks, jednak nie możemy bezpośrednio odwoływać się do właściwości w dokumencie JSON. Rozwiązaniem jest dodanie kolumny obliczanej do ścieżki JSON $.Name , a następnie dodanie indeksu do kolumny obliczanej.

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

CREATE INDEX idx_name
ON JsonTable(vName)

Teraz, gdy wykonujemy to samo zapytanie, zamiast pełnego skanowania tabeli, SQL Server używa indeksu do wyszukiwania w indeksie nieklastrowanym i znajdowania wierszy spełniających określone warunki.

Uwaga: Aby serwer SQL mógł korzystać z indeksu, musisz utworzyć kolumnę obliczeniową z tym samym wyrażeniem, którego planujesz użyć w zapytaniach - w tym przykładzie JSON_VALUE(jsonInfo, '$.Name') , jednak możesz także użyć nazwy obliczonej kolumny vName

Sformatuj jeden wiersz tabeli jako pojedynczy obiekt JSON przy użyciu FOR JSON

Opcja WITHOUT_ARRAY_WRAPPER w klauzuli FOR JSON usunie nawiasy tablicowe z danych wyjściowych JSON. Jest to przydatne, jeśli zwracasz pojedynczy wiersz w zapytaniu.

Uwaga: ta opcja spowoduje wygenerowanie niepoprawnego wyjścia JSON, jeśli zostanie zwrócony więcej niż jeden wiersz.

Dane tabeli wejściowej (tabela osób)

ID Nazwa Wiek
1 Jan 23
2) Jane 31

Pytanie

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

Wynik

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

Analizuj tekst JSON za pomocą funkcji OPENJSON

Funkcja OPENJSON analizuje tekst JSON i zwraca wiele wyników. Wartości, które powinny zostać zwrócone, są określone przy użyciu ścieżek zdefiniowanych w klauzuli WITH. Jeśli dla niektórych kolumn nie podano ścieżki, nazwa kolumny jest używana jako ścieżka. Ta funkcja rzutuje zwrócone wartości na typy SQL zdefiniowane w klauzuli WITH. Opcja AS JSON musi być określona w definicji kolumny, jeśli należy zwrócić jakiś obiekt / tablicę.

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]')

Wynik

ID Nazwa UserObject Umiejętności Umiejętność 0
1 Jan {„name”: „John”} [„C #”, „SQL”] DO#


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow