Ich würde es nicht wirklich empfehlen, es gibt viel bessere Möglichkeiten, dies in der Anwendungsschicht zu tun, aber das Folgende vermeidet Schleifen und ist viel weniger ausführlich als Ihre aktuelle 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
Hinweis:Ich habe Ihren zweiteiligen Objektnamen (@schema und @table) geändert, um nur den vollständigen Objektnamen zu akzeptieren.
Die Idee ist, im Grunde die XML-Erweiterung in SQL-Server zu verwenden, um die Tabelle in XML umzuwandeln, und dann einfach die Start-Tags durch {ColumnName:
zu ersetzen und die End-Tags mit ,
. Es sind dann zwei weitere Ersetzungen erforderlich, um die schließende Klammer in der letzten Spalte jeder Zeile hinzuzufügen und den letzten ,
zu entfernen aus der JSON-Zeichenfolge.