guardar - json sql server 2014
SQL a JSON: matriz de objetos a matriz de valores en SQL 2016 (5)
SQL 2016 tiene una nueva característica que convierte los datos en el servidor SQL a JSON. Tengo dificultades para combinar una matriz de objetos en una matriz de valores, es decir,
EJEMPLO
CREATE TABLE #temp (item_id VARCHAR(256))
INSERT INTO #temp VALUES (''1234''),(''5678''),(''7890'')
SELECT * FROM #temp
--convert to JSON
SELECT (SELECT item_id
FROM #temp
FOR JSON PATH,root(''ids''))
RESULTADO -
{
"ids": [{
"item_id": "1234"
},
{
"item_id": "5678"
},
{
"item_id": "7890"
}]
}
Pero quiero el resultado como ...
"ids": [
"1234",
"5678",
"7890"
]
Puede alguien por favor ayudarme?
¡Gracias! La alma que encontramos se está convirtiendo en XML primero:
SELECT
JSON_QUERY(''['' + STUFF(( SELECT '','' + ''"'' + item_id + ''"''
FROM #temp FOR XML PATH('''')),1,1,'''') + '']'' ) ids
FOR JSON PATH , WITHOUT_ARRAY_WRAPPER
¡Martín!
Creo que esta es una forma aún más simple de hacerlo:
SELECT ''"ids": '' +
REPLACE(
REPLACE( (SELECT item_id FROM #temp FOR JSON AUTO),''{"item_id":'','''' ),
''"}'',''"'' )
Dado que las matrices de valores primitivos son JSON válidos, parece extraño que una función para seleccionar matrices de valores primitivos no esté integrada en la funcionalidad JSON de SQL Server. (Si, por el contrario, existe tal funcionalidad, al menos no he podido descubrirla después de un poco de búsqueda).
El enfoque descrito anteriormente funciona como se describe. Pero cuando se aplica para un campo en una consulta más grande, la matriz de primitivas se rodea con comillas.
Por ejemplo, esto
DECLARE @BomTable TABLE (ChildNumber dbo.udt_ConMetPartNumber);
INSERT INTO @BomTable (ChildNumber) VALUES (N''101026''), (N''101027'');
SELECT N''"Children": '' + REPLACE(REPLACE((SELECT ChildNumber FROM @BomTable FOR JSON PATH), N''{"ChildNumber":'', N''''), ''"}'','''');
trabaja produciendo:
"Children": ["101026,"101027]
Pero, siguiendo el enfoque anterior, esto:
SELECT
p.PartNumber,
p.Description,
REPLACE(REPLACE((SELECT
ChildNumber
FROM
Part.BillOfMaterials
WHERE
ParentNumber = p.PartNumber
ORDER BY
ChildNumber
FOR
JSON AUTO
), N''{"ChildNumber":'', N''''), ''"}'', ''"'') AS [Children]
FROM
Part.Parts AS p
WHERE
p.PartNumber = N''104444''
FOR
JSON PATH
Produce:
[
{
"PartNumber": "104444",
"Description": "ASSY HUB R-SER DRIV HP10 ABS",
"Children": "[/"101026/",/"101027/",/"102291/",/"103430/",/"103705/",/"104103/"]"
}
]
Donde la matriz Children está envuelta como una cadena.
La mayoría de estas soluciones crean esencialmente un CSV que representa el contenido de la matriz y luego lo colocan en el formato JSON final. Esto es lo que uso, para evitar XML:
DECLARE @tmp NVARCHAR(MAX) = ''''
SELECT @tmp = @tmp + ''"'' + [item_id] + ''",''
FROM #temp -- Defined and populated in the original question
SELECT [ids] = JSON_QUERY((
SELECT CASE
WHEN @tmp IS NULL THEN ''[]''
ELSE ''['' + SUBSTRING(@tmp, 0, LEN(@tmp)) + '']''
END
))
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
declare @temp table (item_id VARCHAR(256))
INSERT INTO @temp VALUES (''123"4''),(''5678''),(''7890'')
SELECT * FROM @temp
--convert to JSON
select
json_query(QUOTENAME(STRING_AGG(''"'' + STRING_ESCAPE(item_id, ''json'') + ''"'', char(44)))) as [json]
from @temp
for json path
Cuando queremos concatenar cadenas como matriz json, entonces:
1) cadena de escape - STRING_ESCAPE
2) concatenar cadena con separador de coma - STRING_AGG, el código ASCII de coma es 44
3) agregue la cita entre paréntesis - QUOTENAME (sin parámetro)
4) devolver cadena (con matriz de elementos) como json - JSON_QUERY