Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Tabelle in json

Ich würde es nicht wirklich empfehlen, es gibt viel bessere Möglichkeiten, dies in der Anwendungsschicht zu tun, aber das Folgende vermeidet Schleifen und ist viel weniger ausführlich als Ihre aktuelle Methode:

CREATE PROCEDURE dbo.GetJSON @ObjectName VARCHAR(255), @registries_per_request smallint = null
AS
BEGIN
    IF OBJECT_ID(@ObjectName) IS NULL
        BEGIN
            SELECT Json = '';
            RETURN
        END;

    DECLARE @Top NVARCHAR(20) = CASE WHEN @registries_per_request IS NOT NULL 
                                    THEN 'TOP (' + CAST(@registries_per_request AS NVARCHAR) + ') ' 
                                    ELSE '' 
                                END;

    DECLARE @SQL NVARCHAR(MAX) = N'SELECT ' + @Top + '* INTO ##T ' + 
                                'FROM ' + @ObjectName;

    EXECUTE SP_EXECUTESQL @SQL;

    DECLARE @X NVARCHAR(MAX) = '[' + (SELECT * FROM ##T FOR XML PATH('')) + ']';


    SELECT  @X = REPLACE(@X, '<' + Name + '>', 
                    CASE WHEN ROW_NUMBER() OVER(ORDER BY Column_ID) = 1 THEN '{'
                         ELSE '' END + Name + ':'),
            @X = REPLACE(@X, '</' + Name + '>', ','),
            @X = REPLACE(@X, ',{', '}, {'),
            @X = REPLACE(@X, ',]', '}]')
    FROM    sys.columns
    WHERE   [Object_ID] = OBJECT_ID(@ObjectName)
    ORDER BY Column_ID;

    DROP TABLE ##T;

    SELECT  Json = @X;

END

Hinweis:Ich habe Ihren zweiteiligen Objektnamen (@schema und @table) geändert, um nur den vollständigen Objektnamen zu akzeptieren.

Beispiel für SQL Fiddle

Die Idee ist, im Grunde die XML-Erweiterung in SQL-Server zu verwenden, um die Tabelle in XML umzuwandeln, und dann einfach die Start-Tags durch {ColumnName: zu ersetzen und die End-Tags mit , . Es sind dann zwei weitere Ersetzungen erforderlich, um die schließende Klammer in der letzten Spalte jeder Zeile hinzuzufügen und den letzten , zu entfernen aus der JSON-Zeichenfolge.