Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 OpenJson() возвращает NULL вместо подмножества в режиме AS JSON  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3141
То ли баг, то ли я к вечеру туплю уже. Вроде все, как в примере из справки:
declare @Value nvarchar(max) = N'{
	"id": "27fa6c8d-d136-4913-8245-9fdb1d60ac19",
	"data": [{
			"id": "1",
			"value": "My value",
			"additionalInfo": "{  \"State\": \"Done\",  \"Category\": \"Misc.\"}"
		}]
}';

select js.Id, js.Value, js.XData, js.additionalInfo
	, xd.*
from openjson(@Value, '$.data') with (
	Id int '$.id',
	Value varchar(50) '$.value',
	XData nvarchar(max) '$.additionalInfo',
	additionalInfo nvarchar(max) AS JSON
) js
	outer apply openjson(js.XData) xd;
Однако, поле additionalInfo всегда NULL.

Видно, что XData в принципе достаточно, и даже apply за него цепляется и работает. В чем тогда тайный смысл AS JSON, для меня загадка.

Проверялось на:

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 
Oct 28 2016 18:17:30
Copyright (c) Microsoft Corporation
Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2012 R2 Datacenter 6.3 <X64> (Build 9600: ) (Hypervisor)

База свежесозданная, совместимость 130, на мастере то же самое.
19 сен 18, 10:52    [21679162]     Ответить | Цитировать Сообщить модератору
 Re: OpenJson() возвращает NULL вместо подмножества в режиме AS JSON  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Ну как бы когда у вас может быть одно значение, а может быть массив, во втором случае как раз и нужен AS JSON:

DECLARE @Value NVARCHAR(MAX) = N'{
    "data": [{
    "additionalInfo": "{ \"State\": \"Done\", \"Category\": \"Misc.\"}",
    "additionalInfo2": [
            { "State": "Done", "Category": "Misc." },
            { "State": "In progress", "Category": "Misc."  }
        ]
    }]
}';

SELECT xd.*
     , xd2.*
FROM OPENJSON(@Value, '$.data') WITH (
      additionalInfo NVARCHAR(MAX)
    , additionalInfo2 NVARCHAR(MAX) AS JSON
) js
OUTER APPLY OPENJSON(additionalInfo)
    WITH ([State] SYSNAME, Category SYSNAME) xd
OUTER APPLY OPENJSON(additionalInfo2)
    WITH ([State] SYSNAME, Category SYSNAME) xd2
19 сен 18, 11:18    [21679200]     Ответить | Цитировать Сообщить модератору
 Re: OpenJson() возвращает NULL вместо подмножества в режиме AS JSON  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3141
AlanDenton,

Т.е. фигурные скобки это не сабсет, это атомик. Нужны квадратные. Понятно, спасибо, пойду учить разметку.
19 сен 18, 13:06    [21679408]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить