sql >> データベース >  >> RDS >> Sqlserver

SQL Server テーブルから json

    アプリケーション層でこれを行うにはもっと良い方法がありますが、次の方法はループを回避し、現在の方法よりもはるかに冗長ではありません:

    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. 2 部構成のオブジェクト名 (@schema と @table) を、完全なオブジェクト名を受け入れるように変更しました。

    SQL Fiddle の例

    アイデアは、基本的に SQL-Server 内で XML 拡張機能を使用してテーブルを XML に変換し、開始タグを {ColumnName: に置き換えるだけです。 , の終了タグ .次に、各行の最後の列への閉じ括弧の追加を停止し、最後の , を削除するために、さらに 2 つの置換が必要です。 JSON 文字列から。



    1. MySQLストアドプロシージャ

    2. postgreSQLで配列内部インデックスにアクセスする方法は?

    3. 左結合、MySQLを使用した可変および自動インクリメントでクエリを更新

    4. Hibernate-ManyToOne&Inheritance / JOINED /マップされたBy