Durante décadas, las bases de datos relacionales (SQL) y los datos jerárquicos (como XML o JSON) fueron enemigos.
Si querías guardar un JSON en SQL Server, lo metías como texto plano en un campo VARCHAR (y rezabas para no tener que buscar nada dentro de él).
Hoy en día, el mundo es híbrido. Las APIs web hablan JSON. Los sistemas de configuración y facturación electrónica hablan XML. SQL Server ha evolucionado para entender ambos idiomas nativamente.
En este artículo veremos cómo “romper” estos documentos para convertirlos en tablas y viceversa.
JSON vs XML: ¿Cuál usar?
Si estás diseñando una base de datos nueva, aquí tienes la guía rápida:
| Característica | JSON | XML |
|---|---|---|
| Uso principal | APIs Web, Mobile, NoSQL | Integraciones Enterprise, SOAP, Configs |
| Almacenamiento | NVARCHAR(MAX) | Tipo de dato XML (binario) |
| Tamaño | Ligero | Pesado (muchas etiquetas) |
| Validación | Manual (o CHECK constraints) | Automática (XML Schema XSD) |
| Velocidad | Más rápido de procesar | Más lento (Parsing complejo) |
JSON en SQL Server
Desde SQL Server 2016, el soporte para JSON es nativo. Pero, no existe un tipo específico de dato “JSON”. Los datos JSON se almacenan en columnas NVARCHAR, pero el motor incluye funciones para validarlos y consultarlos.
Leer JSON (Parsear)
Imagina que recibes este JSON de una API:
{
"Cliente": "Ana",
"Edad": 30,
"Direccion": {
"Ciudad": "Madrid",
"CP": 28001
}
}
Para extraer valores individuales, usamos JSON_VALUE (para textos/números) y JSON_QUERY (para objetos/arrays).
DECLARE @json NVARCHAR(MAX) = '... (el json de arriba) ...';
SELECT
JSON_VALUE(@json, '$.Cliente') AS Nombre, -- Saca "Ana"
JSON_VALUE(@json, '$.Direccion.Ciudad') AS Ciudad, -- Navega y saca "Madrid"
JSON_QUERY(@json, '$.Direccion') AS ObjetoDireccion -- Saca el fragmento JSON entero
De JSON a Tabla (OPENJSON)
Esta es la función nos permite convierte un array de JSON en filas de una tabla relacional. Es ideal para importar datos masivos que vienen de una web.
DECLARE @jsonArray NVARCHAR(MAX) = '[
{"ID": 1, "Prod": "Bici", "Precio": 100},
{"ID": 2, "Prod": "Casco", "Precio": 20}
]';
SELECT *
FROM OPENJSON(@jsonArray)
WITH (
ID INT '$.ID',
Producto VARCHAR(50) '$.Prod',
Precio DECIMAL(10,2) '$.Precio'
);
Resultado:
| ID | Producto | Precio |
|---|---|---|
| 1 | Bici | 100.00 |
| 2 | Casco | 20.00 |
De Tabla a JSON (FOR JSON)
Si quieres enviar los datos de tus tablas a una aplicación web, puedes hacer que SQL Server formatee la salida directamente como JSON añadiendo FOR JSON PATH al final de tu consulta.
SELECT ClienteID, Nombre, Email
FROM Clientes
FOR JSON PATH, ROOT('ListaClientes');
XML en SQL Server
XML es el “hermano mayor” del JSON. Es más verboso y estricto, pero sigue siendo el estándar en muchos entornos (bancarios, médicos y de facturación).
A diferencia de JSON, SQL Server sí tiene un tipo de dato específico llamado XML. Esto permite validar que el contenido esté bien formado antes de guardarlo.
Leer XML (Nodes y Value)
La sintaxis es un poco más compleja (XQuery).
DECLARE @xml XML = '
<Pedidos>
<Pedido ID="100">
<Producto>Teclado</Producto>
<Cantidad>5</Cantidad>
</Pedido>
<Pedido ID="101">
<Producto>Ratón</Producto>
<Cantidad>2</Cantidad>
</Pedido>
</Pedidos>';
-- Desglosamos el XML en filas
SELECT
T.C.value('@ID', 'INT') AS PedidoID, -- Atributo usa @
T.C.value('(Producto)[1]', 'VARCHAR(50)') AS Producto, -- Elemento
T.C.value('(Cantidad)[1]', 'INT') AS Cantidad
FROM @xml.nodes('/Pedidos/Pedido') AS T(C);
.nodes(...): “Rompe” el XML en fragmentos (uno por cada etiqueta<Pedido>)..value(...): Extrae el dato tipado de cada fragmento.
De Tabla a XML (FOR XML)
Al igual que con JSON, podemos exportar resultados en formato XML.
SELECT ClienteID as "@ID", -- Genera un atributo
Nombre as "Datos/Nombre", -- Genera sub-elementos
Email as "Datos/Email"
FROM Clientes
FOR XML PATH('Cliente'), ROOT('Empresa');
Aunque SQL Server maneja bien JSON y XML, no es una base de datos documental (como MongoDB). No guardes toda tu lógica de negocio en una columna JSON gigante.
Usa estas funciones para intercambio de datos (recibir, procesar y guardar en tablas relacionales), pero intenta mantener tu modelo de datos normalizado en filas y columnas para el día a día.
