Ich suche nach der besten Lösung, um eine geschachtelte JSON-Zeichenfolge direkt aus (T) SQL mit einer dynamischen SQL-Abfrage zu erstellen.Verschachtelte JSON mit dynamischer Abfrage
In SQL Server 2016 ist es einfach, einen flachen JSON-String mit einer Anweisung wie folgt zu erstellen:
SELECT *
FROM tblTableName
FOR JSON AUTO
Wenn Sie ein komplexere verschachteltes Ergebnis müssen Sie eine einfache rekursive Routine wie verwenden können:
CREATE FUNCTION [dbo].[NestedJSON](@Id uniqueidentifier)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Json NVARCHAR(MAX) = '{}';
IF @Id Is NULL
SET @Json =
(SELECT *, JSON_QUERY(dbo.NestedJSON(Id)) AS child
FROM dbo.tblTableName
WHERE IDParent is NULL
FOR JSON AUTO);
ELSE
SET @Json =
(SELECT *, JSON_QUERY(dbo.NestedJSON(Id)) AS child
FROM dbo.tblTableName
WHERE IDParent = @Id
FOR JSON AUTO);
RETURN @Json
END
Id is the ID of each record in tblTableName
IDParent is the parent Id of the record in tblTableName
Diese rekursive Funktion funktioniert nur, wenn die SQL-Abfrage festgelegt ist.
In meiner Situation habe ich viele Abfragen mit einer verschachtelten Struktur. Um all die vielen verschachtelten SQL-Abfragen zu unterstützen, habe ich versucht, die obige NestedJSON-Funktion zu modifizieren, aber es ist Nähte, dass es nicht erlaubt ist, dynamisches SQL in einer Funktion zu verwenden. Ich habe versucht, Optionen wie:
IF @Id Is NULL
Set @SQL = 'SELECT @Json=(SELECT ' + @FieldList + ' ,JSON_QUERY(dbo.MenuNested(' + @Id + ')) AS Child FROM ' + @TheTables + ' WHERE IDParent is NULL FOR JSON AUTO)'
ELSE
Set @SQL = 'SELECT @Json=(SELECT ' + @FieldList + ' ,JSON_QUERY(dbo.MenuNested(' + @Id + ')) AS Child FROM ' + @TheTables + ' WHERE IDParent = ' + @Id + ' FOR JSON AUTO)'
Exec(@SQL)
--or
execute sp_executesql @SQL;
Aber alle Modifikationen führten zu den gleichen Fehler: „Nur Funktionen und einige erweiterte gespeicherte Prozeduren können innerhalb einer Funktion ausgeführt werden.“
Ich rufe den SQL-Server von vb.net, so konnte ich eine zusätzliche Funktion zu Tree-a-fy der verschachtelten JSON erstellen, aber das ist die letzte Option für mich. Ich denke, die schnellste und sauberste Lösung ist die vollständige Verschachtelung in (T) SQL.
Also, gibt es jemanden, der mir helfen kann, eine Lösung zu erstellen, die Dynamic SQL unterstützt und einen verschachtelten JSON zurückgibt?
Danke jede Hilfe wird geschätzt.
Arno
Sie können gespeicherte Prozedur anstelle der Funktion – sepupic
verwenden Danke für den Rat. Ich habe noch nicht an einen Remote-Prozess gedacht. Ist eine Remote-Prozedur so schnell wie eine Funktion? – Arno
Wenn Ihre SP die gleichen Dinge tun, wird es die gleiche Ausführungszeit haben. Der Unterschied ist, wie Sie das Ergebnis erhalten: funcion Ergebnis kann direkt in Abfragen verwendet werden, sp Ergebnis sollte gespeichert werden, bevor Sie es verwenden können – sepupic