sql >> Database >  >> RDS >> Sqlserver

SQL Server-tabel naar json

Ik zou het niet echt adviseren, er zijn veel betere manieren om dit in de applicatielaag te doen, maar het volgende voorkomt lussen en is een stuk minder uitgebreid dan je huidige 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

NB Ik heb je tweedelige objectnaam (@schema en @table) gewijzigd om alleen de volledige objectnaam te accepteren.

Voorbeeld op SQL Fiddle

Het idee is om in principe de XML-extensie binnen SQL-Server te gebruiken om de tabel in XML te veranderen, en dan de starttags te vervangen door {ColumnName: en de eindtags met , . Er zijn dan nog twee vervangingen nodig om te stoppen met het toevoegen van het sluithaakje aan de laatste kolom van elke rij en het verwijderen van de laatste , van de JSON-tekenreeks.



  1. Maak een back-up van een enkele tabel met de gegevens ervan uit een database in SQL Server 2008

  2. Hoe kan ik meerdere kolommen SELECTEREN binnen een CASE WHEN op SQL Server?

  3. Enkele rij, enkele kolom ophalen met PDO

  4. Standaarden / conventies voor kolomnaam in MySQL