Microsoft SQL Server
OPENJSON
Buscar..
Obtener clave: pares de valores de texto JSON
La función OPENJSON analiza el texto JSON y devuelve todos los pares clave: valor en el primer nivel de JSON:
declare @json NVARCHAR(4000) = N'{"Name":"Joe","age":27,"skills":["C#","SQL"]}';
SELECT * FROM OPENJSON(@json);
llave | valor | tipo |
---|---|---|
Nombre | Joe | 1 |
años | 27 | 2 |
habilidades | ["C #", "SQL"] | 4 |
El tipo de columna describe el tipo de valor, es decir, nulo (0), cadena (1), número (2), booleano (3), matriz (4) y objeto (5).
Transformar la matriz JSON en un conjunto de filas
La función OPENJSON analiza la colección de objetos JSON y devuelve valores del texto JSON como un conjunto de filas.
declare @json nvarchar(4000) = N'[
{"Number":"SO43659","Date":"2011-05-31T00:00:00","Customer": "MSFT","Price":59.99,"Quantity":1},
{"Number":"SO43661","Date":"2011-06-01T00:00:00","Customer":"Nokia","Price":24.99,"Quantity":3}
]'
SELECT *
FROM OPENJSON (@json)
WITH (
Number varchar(200),
Date datetime,
Customer varchar(200),
Quantity int
)
En la cláusula WITH se especifica el esquema de retorno de la función OPENJSON. Las claves en los objetos JSON se recuperan por nombres de columna. Si alguna clave en JSON no se especifica en la cláusula WITH (por ejemplo, Precio en este ejemplo) se ignorará. Los valores se convierten automáticamente en tipos especificados.
Número | Fecha | Cliente | Cantidad |
---|---|---|---|
SO43659 | 2011-05-31T00: 00: 00 | MSFT | 1 |
SO43661 | 2011-06-01T00: 00: 00 | Nokia | 3 |
Transformar los campos JSON anidados en un conjunto de filas
La función OPENJSON analiza la colección de objetos JSON y devuelve valores del texto JSON como un conjunto de filas. Si los valores en el objeto de entrada están anidados, se puede especificar un parámetro de mapeo adicional en cada columna en la cláusula WITH:
declare @json nvarchar(4000) = N'[
{"data":{"num":"SO43659","date":"2011-05-31T00:00:00"},"info":{"customer":"MSFT","Price":59.99,"qty":1}},
{"data":{"number":"SO43661","date":"2011-06-01T00:00:00"},"info":{"customer":"Nokia","Price":24.99,"qty":3}}
]'
SELECT *
FROM OPENJSON (@json)
WITH (
Number varchar(200) '$.data.num',
Date datetime '$.data.date',
Customer varchar(200) '$.info.customer',
Quantity int '$.info.qty',
)
En la cláusula WITH se especifica el esquema de retorno de la función OPENJSON. Después de que el tipo se especifique, la ruta a los nodos JSON donde se debe encontrar el valor devuelto. Las claves en los objetos JSON son recuperadas por estas rutas. Los valores se convierten automáticamente en tipos especificados.
Número | Fecha | Cliente | Cantidad |
---|---|---|---|
SO43659 | 2011-05-31T00: 00: 00 | MSFT | 1 |
SO43661 | 2011-06-01T00: 00: 00 | Nokia | 3 |
Extracción de subobjetos JSON internos
OPENJSON puede extraer fragmentos de objetos JSON dentro del texto JSON. En la definición de columna que hace referencia al subobjeto JSON, establezca el tipo nvarchar (max) y la opción AS JSON:
declare @json nvarchar(4000) = N'[
{"Number":"SO43659","Date":"2011-05-31T00:00:00","info":{"customer":"MSFT","Price":59.99,"qty":1}},
{"Number":"SO43661","Date":"2011-06-01T00:00:00","info":{"customer":"Nokia","Price":24.99,"qty":3}}
]'
SELECT *
FROM OPENJSON (@json)
WITH (
Number varchar(200),
Date datetime,
Info nvarchar(max) '$.info' AS JSON
)
La columna de información se asignará al objeto "Info". Los resultados serán:
Número | Fecha | Información |
---|---|---|
SO43659 | 2011-05-31T00: 00: 00 | {"cliente": "MSFT", "Precio": 59.99, "cantidad": 1} |
SO43661 | 2011-06-01T00: 00: 00 | {"cliente": "Nokia", "Precio": 24.99, "cantidad": 3} |
Trabajar con subarreglas JSON anidadas
JSON puede tener una estructura compleja con matrices internas. En este ejemplo, tenemos una matriz de órdenes con una matriz matriz anidada de artículos de pedido.
declare @json nvarchar(4000) = N'[
{"Number":"SO43659","Date":"2011-05-31T00:00:00",
"Items":[{"Price":11.99,"Quantity":1},{"Price":12.99,"Quantity":5}]},
{"Number":"SO43661","Date":"2011-06-01T00:00:00",
"Items":[{"Price":21.99,"Quantity":3},{"Price":22.99,"Quantity":2},{"Price":23.99,"Quantity":2}]}
]'
Podemos analizar las propiedades de nivel de raíz utilizando OPENJSON que devolverá el arreglo de elementos según el fragmento JSON. Luego podemos aplicar OPENJSON nuevamente en la matriz de elementos y abrir la tabla JSON interna. La tabla de primer nivel y la tabla interna se "unirán" como en UNIR entre tablas estándar:
SELECT *
FROM
OPENJSON (@json)
WITH ( Number varchar(200), Date datetime,
Items nvarchar(max) AS JSON )
CROSS APPLY
OPENJSON (Items)
WITH ( Price float, Quantity int)
Resultados:
Número | Fecha | Artículos | Precio | Cantidad |
---|---|---|---|---|
SO43659 | 2011-05-31 00: 00: 00.000 | [{"Precio": 11.99, "Cantidad": 1}, {"Precio": 12.99, "Cantidad": 5}] | 11.99 | 1 |
SO43659 | 2011-05-31 00: 00: 00.000 | [{"Precio": 11.99, "Cantidad": 1}, {"Precio": 12.99, "Cantidad": 5}] | 12.99 | 5 |
SO43661 | 2011-06-01 00: 00: 00.000 | [{"Precio": 21.99, "Cantidad": 3}, {"Precio": 22.99, "Cantidad": 2}, {"Precio": 23.99, "Cantidad": 2}] | 21.99 | 3 |
SO43661 | 2011-06-01 00: 00: 00.000 | [{"Precio": 21.99, "Cantidad": 3}, {"Precio": 22.99, "Cantidad": 2}, {"Precio": 23.99, "Cantidad": 2}] | 22.99 | 2 |
SO43661 | 2011-06-01 00: 00: 00.000 | [{"Precio": 21.99, "Cantidad": 3}, {"Precio": 22.99, "Cantidad": 2}, {"Precio": 23.99, "Cantidad": 2}] | 23.99 | 2 |