Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Tabela SQL Server do json

Naprawdę nie radziłbym tego, są o wiele lepsze sposoby na zrobienie tego w warstwie aplikacji, ale poniższa metoda pozwala uniknąć pętli i jest o wiele mniej gadatliwa niż aktualna metoda:

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

Uwaga Zmieniłem twoją dwuczęściową nazwę obiektu (@schema i @table), aby po prostu zaakceptować pełną nazwę obiektu.

Przykład SQL Fiddle

Pomysł polega na tym, aby użyć rozszerzenia XML w SQL-Server do przekształcenia tabeli w XML, a następnie po prostu zastąpić tagi startowe tagami {ColumnName: a znaczniki końcowe z , . Następnie wymaga dwóch dodatkowych zamian, aby zatrzymać dodawanie nawiasu zamykającego do ostatniej kolumny każdego wiersza, a także usunąć końcowy , z ciągu JSON.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie, aby uzyskać tylko liczby z ciągu

  2. Jak przekazać wartość do parametru procedury składowanej w składniku źródłowym OLE DB?

  3. Pojedyncze zapytanie sql, które może obsłużyć zarówno zakres dat zerowy, jak i wartościowy na serwerze sql

  4. Rozwiązywanie problemów z zakleszczeniami w SQL Server 2008

  5. Najlepszy sposób na uzyskanie PK Guid wstawionego wiersza