Tema SQL
OPENJSON (SQL Server)
Descompone texto JSON en filas y columnas tipadas (2016+). Paralelo conceptual a JSON_TABLE en MySQL y jsonb_to_recordset en PostgreSQL.
Descripción
OPENJSON(doc [, path]) WITH (columnas tipadas con rutas JSON) proyecta objetos y arrays a tablas relacionales. Sin WITH devuelve key, value y type. Se combina con CROSS APPLY para múltiples documentos. Modo strict y rutas anidadas según versión. Errores de formato abortan la sentencia. Indexar JSON: columnas persistidas calculadas más índice.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
SELECT *
FROM OPENJSON(@json)
WITH (
id INT 'strict $.id',
nombre NVARCHAR(100) '$.nombre'
);
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Arrays
- OPENJSON(array) con índices [0],[1] en paths.
- PostgreSQL
- json_populate_recordset, jsonb_to_recordset.
Ejemplos
Ejemplo 1
DECLARE @j NVARCHAR(MAX) = N'[{"id":1,"k":"a"},{"id":2,"k":"b"}]';
SELECT *
FROM OPENJSON(@j)
WITH (id INT '$.id', k NVARCHAR(10) '$.k');
SELECT o.id, j.sku
FROM pedidos o
CROSS APPLY OPENJSON(o.detalle_json) WITH (sku VARCHAR(20) '$.sku') AS j;
Ejemplo 2
DECLARE @j NVARCHAR(200) = N'{"a":1,"b":2}';
SELECT [key], value FROM OPENJSON(@j);
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.