json-xml-sql-server

Datos JSON y XML en SQL Server

  • 4 min

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ísticaJSONXML
Uso principalAPIs Web, Mobile, NoSQLIntegraciones Enterprise, SOAP, Configs
AlmacenamientoNVARCHAR(MAX)Tipo de dato XML (binario)
TamañoLigeroPesado (muchas etiquetas)
ValidaciónManual (o CHECK constraints)Automática (XML Schema XSD)
VelocidadMás rápido de procesarMá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
  }
}
Copied!

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
Copied!

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'
);
Copied!

Resultado:

IDProductoPrecio
1Bici100.00
2Casco20.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');
Copied!

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);
Copied!
  1. .nodes(...): “Rompe” el XML en fragmentos (uno por cada etiqueta <Pedido>).
  2. .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');
Copied!

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.