sql >> Base de Datos >  >> RDS >> Sqlserver

JSON en servidor SQL

JSON (J avaS código O objeto N otation) es un estándar muy popular para el intercambio de datos, especialmente en la API REST. Casi todos los sitios web modernos, aplicaciones de Android o iOS usan esto para intercambiar datos con el servidor. Desde SQL Server 2016, Microsoft amplía su soporte para JSON a través de un par de funciones integradas. De esta forma, SQL Server admite funciones NOSQL en bases de datos relacionales tradicionales. Examinémoslo:

  • ISJSON:examina una cadena si es un JSON válido o no
  • JSON_VALUE:recupera el valor de una cadena JSON
  • JSON_QUERY:obtiene un objeto o una matriz de una cadena JSON
  • JSON_MODIFY:devuelve la cadena JSON actualizada
  • OPENJSON:analiza el texto JSON y devuelve objetos y propiedades de la entrada JSON como filas y columnas
  • Cláusula FOR JSON:exporta datos SQL a formato JSON

Función ISJSON

DECLARE @json NVARCHAR(MAX); 
SET @json = N'{
"info":[
{
"id":"1",
"name":"Robert Aragon",
"ssn":"489-36-8350",
"credit_card":[
"4929-3813-3266-4295",
"5370-4638-8881-3020"
],
"address":{
"town":"Avon",
"area":"New York",
"zipcode":"76148"
}
},
{
"id":"2",
"name":"Thomas Conley",
"ssn":"690-05-5315",
"credit_card":[
"5299-1561-5689-1938"
],
"address":{
"town":"Jackson Street",
"area":"New York",
"zipcode":"80233"
}
},
{
"id":"3",
"name":"Susan Davis",
"ssn":"421-37-1396",
"credit_card":[
"5293-8502-0071-3058"
],
"address":{
"town":"Rock Beach",
"area":"Los angeles",
"zipcode":"900341"
}
},
{
"id":"4",
"name":"Christopher Diaz",
"ssn":"458-02-6124",
"credit_card":[
"5548-0246-6336-5664"
],
"address":{
"town":"Small town",
"area":"Wasshington",
"zipcode":"63126"
}
},
{
"id":"5",
"name":"Rick Edwards",
"ssn":"612-20-6832",
"credit_card":[
"4539-5385-7425-5825"
],
"address":{
"town":"Free Town",
"area":"Utah",
"zipcode":"97222"
}
},
{
"id":"6",
"name":"Victor Faulkner",
"ssn":"300-62-3266",
"credit_card":[
"4916-9766-5240-6147",
"4532-4220-6922-9909",
"5218-0144-2703-9266"
],
"address":{
"town":"Dakota",
"area":"North Dakota",
"zipcode":"92104"
}
}
]
}
'; 
SELECT ISJSON(@json);

Salida

1 -- 1 if it is a valid JSON otherwise 0

Función JSON_VALUE

Esta función se usa para recuperar un valor escalar de una cadena JSON. Su sintaxis es

JSON_VALUE(expression, path)

expresión es el nombre de una variable o una columna que contiene texto JSON y es la propiedad a extraer. Por ejemplo, ejecutar la siguiente declaración en la cadena JSON anterior producirá el siguiente resultado:

SELECT JSON_VALUE(@json, '$.info[3].credit_card[0]')

Salida

5548-0246-6336-5664

La función JSON_VALUE devuelve un único valor de texto de tipo nvarchar(4000) . Devuelve null si la ruta especificada no se encuentra en el objeto JSON o el valor está más allá de nvarchar (4000). Usar ‘estricto La palabra clave antes de la ruta generará el error si la ruta especificada no está disponible en el objeto JSON.

Función JSON_QUERY

El La función JSON_QUERY(expresión [,ruta]) toma el nombre de una variable o una columna que contiene texto JSON y la ruta JSON que especifica el objeto o la matriz para extraer como sus argumentos.

Salida

Devuelve un fragmento JSON de tipo nvarchar(max) . Al igual que la función JSON_VALUE, devuelve un valor nulo si el valor especificado no es un objeto o una matriz. El uso de la palabra clave "estricta" arrojará el error.

Función JSON_MODIFY

Actualiza el valor de una propiedad en una cadena JSON y devuelve la cadena JSON actualizada. Toma expresión, camino y nuevo como argumentos. Usando esta función, podemos hacer la siguiente operación en una cadena JSON:

  1. Actualizar
  2. Insertar
  3. Eliminar
  4. Anexar
1. Actualizar

Actualiza el valor de una ruta dada.

SELECT JSON_MODIFY(@json,'$.info[0].name', 'Mehedi')

Salida

2. Insertar

Se agrega un nuevo valor en la cadena JSON si el atributo en la ruta proporcionada no existe. De lo contrario, actualizará el valor existente según el ejemplo anterior. El nuevo atributo se agrega al final del JSON.

SELECT JSON_MODIFY(@json,'$.info[0].last_name', 'Mehedi')

Salida

3. Eliminar

Poner el valor NULL en la ruta simplemente lo eliminará.

SELECT JSON_MODIFY(@json,'$.info[0].name', NULL)

Salida

4. Agregar

El nuevo elemento se puede agregar en una matriz como la siguiente:

SELECT JSON_MODIFY(@json,'append $.info[0].credit_card','4539-5385-7425-5825')

Salida

Función OPENJSON

Esta es una función con valores de tabla que analiza texto JSON y devuelve objetos y propiedades de la entrada JSON como filas y columnas.

DECLARE @json NVARCHAR(MAX);
SET @json =
N'{"id":"1", "name": "Robert Aragon", "ssn": "489-36-8350",
"credit_card":["4929-3813-3266-4295","5370-4638-8881-3020"], "address":
{"town": "Avon", "area": "New York", "zipcode": "76148"}}';
SELECT * FROM OpenJson(@json)
with (
    id int  '$.id',
    name varchar(50) '$.name',
    ssn varchar(50) '$.ssn',
    [credit_card] nvarchar(MAX)  AS JSON,
    [address] nvarchar(MAX)  AS JSON
)

Salida

Cláusula FOR JSON

Esta cláusula se usa ampliamente con TSQL para exportar datos de tablas SQL a formato JSON. Tiene dos variantes:

  • AUTO:la salida JSON predeterminada se genera mediante la opción AUTO.
  • PATH:la estructura de JSON se puede modificar mediante el nombre de la columna o los alias mediante la opción PATH
IF OBJECT_ID('Test1', 'U') IS NOT NULL
    DROP TABLE Test1;
GO

-- Create the table 
CREATE TABLE Test1( 
    pk_id    int not null identity(1,1), 
    name    varchar(10) default ('Mehedi') 
) 
 GO 
 -- Populate with 3 sample data 
 INSERT INTO Test1 default values
GO 2
IF OBJECT_ID('Test2', 'U') IS NOT NULL
    DROP TABLE Test2;
GO
-- Create the table
CREATE TABLE Test2(
    pk_id    int not null identity(1,1),
    area    varchar(10) default ('Dhanmondi'),
    city    varchar(10) default ('Dhaka')
)
GO
-- Populate with 3 sample data
INSERT INTO Test2 default values
GO 1
-- Example of AUTO
SELECT A.pk_id, A.name, (SELECT pk_id, area, city
    FROM Test2 B
    WHERE A.pk_id = B.pk_id
    FOR JSON AUTO
    ) as test2
FROM Test1 A
FOR JSON AUTO
-- Example of PATH
SELECT A.pk_id, A.name, (SELECT pk_id as id, area, city
    FROM Test2 B
    WHERE A.pk_id = B.pk_id
    FOR JSON AUTO
    ) as test2
FROM Test1 A
FOR JSON PATH , ROOT ('EmployeeInfo')
GO

Salida

Conclusión

Esto es todo sobre el JSON en SQL Server. ¡Feliz TSQLing!

Este artículo está tomado de mi blog.