SQL LIFE

Sql Server OPENJSON Kullanımı

sql server openjson kullanımı

Merhaba,
Bu yazımda OPENJSON ile sql server’ da json to table işlemine  değinmek istiyorum. Sql Server 2016 versiyonuyla birlikte gelen bir table valued function olan OPENJSON,  tam deyimiyle bize sağlam bir kıyak geçiyor.
Örneğim için nested bir json seçtim ki tam anlaşılsın.
Son olarak da OUTER APPLY ile ilişkili satırları birleştirelim. Böyelce birkaç farklı veriye erişim ve kullanım görmüş olalım.

{
    "resultCode": "0",
    "resultDescription": "OK",
    "resultType": "SUCCESS",
    "body": {
        "queryInformation": {
            "begin": 1,
            "end": 5,
            "count": 9999
        },
        "Data": [
            {
                "id": "40Z999999999",
                "consumption": "143.75",
                "generation": "500.2",
                "lossyConsumption": "143.75",
                "lossyGeneration": "500.1959",
                "version": "2020-01-01T00:00:00.000+0300"
            },
            {
                "id": "40Z8888888888",
                "consumption": "0.25",
                "generation": "856.83",
                "lossyConsumption": "0.25",
                "lossyGeneration": "856.6486",
                "version": "2020-01-01T00:00:00.000+0300"
            },
            {
                "id": "40Z7777777777",
                "consumption": "2.842",
                "generation": "3455.6175",
                "lossyConsumption": "2.842",
                "lossyGeneration": "3434.1056",
                "version": "2020-01-01T00:00:00.000+0300"
            },
			{
                "id": "40Z66666666",
                "consumption": "0",
                "generation": "0",
                "lossyConsumption": "0",
                "lossyGeneration": "0",
                "version": "2020-01-01T00:00:00.000+0300"
            }
        ]
    }
}
 

CROSS APPLY gibi join işlemlerinde kullanmak istersek, İç Data Json’ınındaki alanlara erişmek için, iç JSON’ı subJSON değişkenine atıp tekrar kullanbiliriz.
 

DECLARE @json NVARCHAR(MAX)


SET @json='{
    "resultCode": "0",
    "resultDescription": "OK",
    "resultType": "SUCCESS",
    "body": {
        "queryInformation": {
            "begin": 1,
            "end": 5,
            "count": 9999
        },
        "Data": [
            {
                "id": "40Z999999999",
                "consumption": "143.75",
                "generation": "500.2",
                "lossyConsumption": "143.75",
                "lossyGeneration": "500.1959",
                "version": "2020-01-01T00:00:00.000+0300"
            },
            {
                "id": "40Z8888888888",
                "consumption": "0.25",
                "generation": "856.83",
                "lossyConsumption": "0.25",
                "lossyGeneration": "856.6486",
                "version": "2020-01-01T00:00:00.000+0300"
            },
            {
                "id": "40Z7777777777",
                "consumption": "2.842",
                "generation": "3455.6175",
                "lossyConsumption": "2.842",
                "lossyGeneration": "3434.1056",
                "version": "2020-01-01T00:00:00.000+0300"
            },
			{
                "id": "40Z66666666",
                "consumption": "0",
                "generation": "0",
                "lossyConsumption": "0",
                "lossyGeneration": "0",
                "version": "2020-01-01T00:00:00.000+0300"
            }
        ]
    }
}'	;

SELECT dd.id,dd.generation,dd.consumption,resultType,lossyConsumption
FROM OPENJSON(@json) with(
lossyConsumption nvarchar(10) '$.body.Data.lossyConsumption',
resultType nvarchar(10) '$.resultType',
subJSON        NVARCHAR(max)    '$.body.Data' as json
) as aa
OUTER APPLY OPENJSON(subJSON)
  WITH (id NVARCHAR(20) '$.id',
		consumption NVARCHAR(20) '$.consumption',
		generation NVARCHAR(20) '$.generation'
		) as dd;

sqllife ezgim çelik
#
Ezgim Çelik
They didn't know it was impossible, so they did it - Mark Twain