Tôi sẽ không thực sự khuyên bạn điều này, có nhiều cách tốt hơn để thực hiện việc này trong lớp ứng dụng, nhưng những cách sau tránh được các vòng lặp và ít dài dòng hơn nhiều so với phương pháp hiện tại của bạn:
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. Tôi đã thay đổi tên đối tượng hai phần của bạn (@schema và @table) để chỉ chấp nhận tên đối tượng đầy đủ.
Về cơ bản, ý tưởng là sử dụng tiện ích mở rộng XML trong SQL-Server để chuyển bảng thành XML, sau đó chỉ cần thay thế các thẻ bắt đầu bằng {ColumnName:
và các thẻ kết thúc bằng ,
. Sau đó, nó yêu cầu thêm hai thay thế nữa để dừng thêm dấu ngoặc đóng vào cột cuối cùng của mỗi hàng và xóa ,
cuối cùng từ chuỗi JSON.