Uso de JSON en la base de datos SQL Server

1) Introducción

Desde SQL Server 2016, Microsoft incorporó soporte para JSON, pero a diferencia de MySQL o PostgreSQL:

  • No existe un tipo de dato JSON: se guarda en columnas NVARCHAR (generalmente NVARCHAR(MAX)).
  • Incluye funciones integradas para parsear, consultar y generar JSON.
  • El contenido se valida solo cuando se invocan funciones JSON (no al insertar).

2) Guardar JSON en SQL Server

CREATE TABLE Productos (
    Id INT IDENTITY PRIMARY KEY,
    Nombre NVARCHAR(100),
    Datos NVARCHAR(MAX) -- aquí guardamos JSON
);

INSERT INTO Productos (Nombre, Datos)
VALUES 
('Teclado', N'{"codigo":101,"precio":1200.50,"disponible":true,"tags":["periférico","oferta"]}'),
('Mouse',   N'{"codigo":102,"precio":850.75,"disponible":false}');
-- Observación: el prefijo N indica string Unicode (NVARCHAR).

3) Consultar JSON en SQL Server

Extraer valores con JSON_VALUE (devuelve un valor escalar)

SELECT 
    Nombre,
    JSON_VALUE(Datos, '$.codigo') AS Codigo,
    JSON_VALUE(Datos, '$.precio') AS Precio
FROM Productos;

Extraer objetos o arrays con JSON_QUERY (devuelve objeto/array completo)

SELECT 
    Nombre,
    JSON_QUERY(Datos, '$.tags') AS Tags
FROM Productos;

4) Consultar con condiciones sobre JSON

SELECT Nombre, JSON_VALUE(Datos, '$.precio') AS Precio
FROM Productos
WHERE CAST(JSON_VALUE(Datos, '$.precio') AS DECIMAL(10,2)) > 1000;

5) Modificar JSON en SQL Server

Reemplazar o agregar campos con JSON_MODIFY

-- Actualizar el precio del Mouse
UPDATE Productos
SET Datos = JSON_MODIFY(Datos, '$.precio', 900.00)
WHERE Nombre = 'Mouse';

-- Eliminar el campo "tags"
UPDATE Productos
SET Datos = JSON_MODIFY(Datos, '$.tags', NULL)
WHERE Nombre = 'Teclado';

6) Convertir resultados SQL → JSON

SQL Server puede generar JSON a partir de consultas usando FOR JSON.

Ejemplo simple

SELECT Id, Nombre
FROM Productos
FOR JSON AUTO;
-- Resultado: [{"Id":1,"Nombre":"Teclado"},{"Id":2,"Nombre":"Mouse"}]

Ejemplo con formato controlado

SELECT Id, Nombre, Datos
FROM Productos
FOR JSON PATH, ROOT('productos');
-- Resultado con root "productos" y PATH controlado

7) Ejemplo avanzado: pedidos con JSON

CREATE TABLE Pedidos (
    Id INT IDENTITY PRIMARY KEY,
    Cliente NVARCHAR(100),
    Detalle NVARCHAR(MAX)
);

INSERT INTO Pedidos (Cliente, Detalle)
VALUES
('María', N'{
    "items": [
        {"producto": "Notebook", "cantidad": 1, "precio": 2500.00},
        {"producto": "Mouse", "cantidad": 2, "precio": 850.75}
    ],
    "total": 4201.50
}');

-- Consultar productos de un pedido
SELECT JSON_QUERY(Detalle, '$.items')
FROM Pedidos
WHERE Cliente = 'María';

-- Consultar precio del primer producto
SELECT JSON_VALUE(Detalle, '$.items[0].precio') AS PrecioPrimero
FROM Pedidos
WHERE Cliente = 'María';

8) Validación de JSON en SQL Server

Podemos verificar si un campo contiene JSON válido con ISJSON.

SELECT Nombre, ISJSON(Datos) AS EsJsonValido
FROM Productos;
-- 1 = válido, 0 = no es JSON

9) Índices sobre JSON

SQL Server permite indexar columnas calculadas basadas en valores JSON.

ALTER TABLE Productos
ADD Precio AS CAST(JSON_VALUE(Datos, '$.precio') AS DECIMAL(10,2));

CREATE INDEX IX_Precio ON Productos(Precio);

-- Consulta optimizada
SELECT Nombre FROM Productos WHERE Precio > 1000;

10) Ventajas y desventajas del JSON en SQL Server

Ventajas

  • Se puede almacenar JSON sin necesidad de una base NoSQL.
  • Funciones potentes (JSON_VALUE, JSON_QUERY, JSON_MODIFY).
  • FOR JSON facilita exportar datos como JSON (ideal para APIs REST).
  • Posibilidad de indexar valores extraídos.

Desventajas

  • No es un tipo nativo optimizado (como MongoDB o PostgreSQL).
  • JSON se guarda como texto (NVARCHAR), ocupa más espacio.
  • Validación limitada: asegura sintaxis JSON, no estructura.

Resumen

  • SQL Server no tiene tipo JSON nativo, pero sí soporte completo para manipularlo en columnas NVARCHAR.
  • Funciones clave: JSON_VALUE (escalares), JSON_QUERY (objetos/arrays), JSON_MODIFY (actualizar), ISJSON (validar), FOR JSON (generar JSON).
  • Se pueden indexar propiedades JSON mediante columnas calculadas.