Saya tidak akan menyarankannya, ada banyak cara yang lebih baik untuk melakukan ini di lapisan aplikasi, tetapi yang berikut ini menghindari loop, dan jauh lebih sedikit verbose daripada metode Anda saat ini:
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. Saya telah mengubah nama objek dua bagian Anda (@schema dan @table) menjadi hanya menerima nama objek lengkap.
Idenya adalah pada dasarnya menggunakan ekstensi XML dalam SQL-Server untuk mengubah tabel menjadi XML, lalu ganti tag awal dengan {ColumnName:
dan tag akhir dengan ,
. Kemudian membutuhkan dua penggantian lagi untuk berhenti menambahkan kurung tutup ke kolom terakhir dari setiap baris, dan menghapus ,
terakhir dari string JSON.