Eu tenho valores JSON como seguir em uma coluna. Eu tentei analisá-lo usando OPENJSON.
DECLARE @json NVARCHAR(MAX)='[[108,290,1388,2056],[108,290,1388,2057]]'
DECLARE @json2 NVARCHAR(MAX)='{"1":29893,"2":1}'
DROP TABLE IF EXISTS #T1
SELECT @json AS [json] INTO #t1
INSERT INTO #t1 ([json]) SELECT @json2
SELECT * FROM #T1
CROSS APPLY OPENJSON([json])
WHERE ISJSON([json]) > 0
@json2 é retornado conforme o esperado, pois possui um par chave-valor. Mas @json precisa de outro nível de análise, já que não possui um nome de chave, não consegui analisá-lo usando JSON_VALUE.
Fazer CROSS APPLY novamente está resultando em erro para @json2, pois não estaria em par agora ( para o valor 29893 ).
SELECT * FROM #T1
CROSS APPLY OPENJSON(JSON) A
CROSS APPLY OPENJSON(value) B
WHERE ISJSON([JSON]) > 0
Msg 13609, Level 16, State 4, Line 66
JSON text is not properly formatted. Unexpected character '2' is found at position 0.
Existe uma maneira mais simples de fazer isso para objetos JSON sem nomes de chave onde não preciso aplicar duas lógicas separadas para formatos diferentes?
Você poderia simplesmente filtrar os valores no segundo APPLY para aqueles que são JSON válidos:
(Também alterei seus CROSS APPLYs para OUTER APPLYs. Você pode precisar de alguma filtragem em WHERE para corrigir isso.)