Je ne le conseillerais pas vraiment, il existe de bien meilleures façons de le faire dans la couche application, mais ce qui suit évite les boucles et est beaucoup moins verbeux que votre méthode actuelle :
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. J'ai changé votre nom d'objet en deux parties (@schema et @table) pour accepter simplement le nom d'objet complet.
L'idée est d'utiliser essentiellement l'extension XML dans SQL-Server pour transformer la table en XML, puis de remplacer simplement les balises de début par {ColumnName:
et les balises de fin avec ,
. Il faut ensuite deux remplacements supplémentaires pour arrêter d'ajouter le crochet fermant à la dernière colonne de chaque ligne, et supprimer le dernier ,
à partir de la chaîne JSON.