मैं वास्तव में इसकी सलाह नहीं दूंगा, एप्लिकेशन परत में ऐसा करने के बहुत बेहतर तरीके हैं, लेकिन निम्नलिखित लूप से बचा जाता है, और आपकी वर्तमान विधि की तुलना में बहुत कम वर्बोज़ है:
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
एन.बी. मैंने आपके दो भाग ऑब्जेक्ट नाम (@schema और @table) को केवल पूर्ण ऑब्जेक्ट नाम स्वीकार करने के लिए बदल दिया है।
तालिका को एक्सएमएल में बदलने के लिए मूल रूप से एसक्यूएल-सर्वर के भीतर एक्सएमएल एक्सटेंशन का उपयोग करने का विचार है, फिर बस स्टार्ट टैग को {ColumnName:
से बदलें। और अंत टैग ,
. के साथ . इसके बाद इसे रोकने के लिए दो और प्रतिस्थापनों की आवश्यकता होती है, प्रत्येक पंक्ति के अंतिम कॉलम में क्लोजिंग ब्रैकेट जोड़ना, और अंतिम ,
को हटाना। JSON स्ट्रिंग से।