Desde SQL Server 2016, Microsoft incorporó soporte para JSON, pero a diferencia de MySQL o PostgreSQL:
NVARCHAR
(generalmente NVARCHAR(MAX)
).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).
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;
SELECT Nombre, JSON_VALUE(Datos, '$.precio') AS Precio
FROM Productos
WHERE CAST(JSON_VALUE(Datos, '$.precio') AS DECIMAL(10,2)) > 1000;
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';
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
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';
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
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;
Ventajas
JSON_VALUE
, JSON_QUERY
, JSON_MODIFY
).FOR JSON
facilita exportar datos como JSON (ideal para APIs REST).Desventajas
NVARCHAR
), ocupa más espacio.NVARCHAR
.JSON_VALUE
(escalares), JSON_QUERY
(objetos/arrays), JSON_MODIFY
(actualizar), ISJSON
(validar), FOR JSON
(generar JSON).