query guardar convert consulta sql json sql-server-2016

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