我不会真正建议这样做,在应用程序层中有很多更好的方法可以做到这一点,但是以下内容避免了循环,并且比当前方法更冗长:
CREATE PROCEDURE dbo.GetJSON @ObjectName VARCHAr(255), @registries_per_request smallint = nullASBEGIN 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)以仅接受完整的对象名称。
SQL小提琴上的示例
想法是基本上使用SQL-
Server中的XML扩展将表转换为XML,然后仅将开始标记替换为
{ColumnName:并将结束标记替换为,。然后,它需要再进行两次替换,才能停止在每行的最后一列中添加右括号,并
,从JSON字符串中删除最后一个。



