アプリケーション層でこれを行うにはもっと良い方法がありますが、次の方法はループを回避し、現在の方法よりもはるかに冗長ではありません:
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-Server 内で XML 拡張機能を使用してテーブルを XML に変換し、開始タグを
{ColumnName:
に置き換えるだけです。,
の終了タグ .次に、各行の最後の列への閉じ括弧の追加を停止し、最後の,
を削除するために、さらに 2 つの置換が必要です。 JSON 文字列から。