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.
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.