Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Table SQL Server en json

Je ne le conseillerais pas vraiment, il existe de bien meilleures façons de le faire dans la couche application, mais ce qui suit évite les boucles et est beaucoup moins verbeux que votre méthode actuelle :

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

N.B. J'ai changé votre nom d'objet en deux parties (@schema et @table) pour accepter simplement le nom d'objet complet.

Exemple sur SQL Fiddle

L'idée est d'utiliser essentiellement l'extension XML dans SQL-Server pour transformer la table en XML, puis de remplacer simplement les balises de début par {ColumnName: et les balises de fin avec , . Il faut ensuite deux remplacements supplémentaires pour arrêter d'ajouter le crochet fermant à la dernière colonne de chaque ligne, et supprimer le dernier , à partir de la chaîne JSON.