SQL 服务器 2016 SSMS Json 格式化

SQL Server 2016 SSMS Json Formatting

我正在 SQL Server 2016 的 SSMS 中使用 JSON。有什么方法可以解决 FOR JSON 语句的结果显示为 XML列?

是否有任何设置更改、附加组件、外部工具等,甚至黑客来减轻这种痛苦?

在我的理想世界中,单击 JSON 列(或 XML 列)将在我选择的文本编辑器中打开,例如 Visual Studio 代码,使用 SSMS 知道列中的字符串是 JSON 并将其保存到扩展名为 .json 的文件中。

Azure Data Studio 会做你想做的大部分事情。

运行 您的查询:

点击结果将打开一个新选项卡,格式为 JSON:

我只想补充一点,VS Code 的 "MsSql Extension" 确实开始变得非常有用,它提供了您所期望的那种 JSON 支持。

它不会取代 SSMS,但适用于基本 SQL 工作,当您单击 JSON 列时,它实际上会以格式化的 JSON 格式打开!额外的好处是,这些天我通常会打开 VS Code 来处理其他事情。

这样的事情怎么样?我只是写了这篇文章,所以它没有经过“仔细”测试,但似乎有效。

DROP FUNCTION IF EXISTS PrettyJSONInternal
GO
CREATE OR ALTER FUNCTION PrettyJSONInternal (
  @JSON NVARCHAR(MAX),
  @IndentString AS NVARCHAR(32) = '  ',
  @Level INT = 0,
  @NL NVARCHAR(2),
  @CurrIndent AS NVARCHAR(MAX) = '  '
) RETURNS NVARCHAR(MAX)
AS BEGIN
  DECLARE @JSONTbl AS TABLE (i INT IDENTITY(0,1), k NVARCHAR(MAX), v NVARCHAR(MAX), t INT)
  DECLARE @N AS INT, @I AS INT = 0

  INSERT INTO @JSONTbl (k, v, t)
  SELECT [key], [value], [type]
    FROM OPENJSON(@JSON)
  SET @N = @@ROWCOUNT

  DECLARE @Return AS NVARCHAR(MAX) = ''
  IF @Level = 0 SET @Return = '{' + @NL
  SET @I = 0
  WHILE @I < @N
  BEGIN
    DECLARE @EOL AS NVARCHAR(10) = ',' + @NL
    IF @I + 1 = @N SET @EOL = @NL
    DECLARE @k AS NVARCHAR(MAX), @v AS NVARCHAR(MAX), @t AS INT
    SELECT @k = k, @v = v, @t = t FROM @JSONTbl WHERE i = @I
    IF @t = 1
      SET @Return = @Return + @CurrIndent + '"' + @k + '" : "' + @v + '"' + @EOL
    ELSE IF @t = 2 OR @t = 3
      SET @Return = @Return + @CurrIndent + '"' + @k + '" : ' + @v + @EOL
    ELSE IF @t = 4
      SET @Return = @Return + @CurrIndent + '"' + @k + '" : [' + @NL + 
                    dbo.PrettyJSONInternal(@v, @IndentString, @Level + 1, @NL, @CurrIndent + @IndentString) +
                    @CurrIndent + ']' + @EOL
    ELSE IF @t = 5
      SET @Return = @Return + @CurrIndent + '{' + @NL + 
                    dbo.PrettyJSONInternal(@v, @IndentString, @Level + 1, @NL, @CurrIndent + @IndentString) +
                    @CurrIndent + '}' + @EOL
    SET @I = @I + 1
  END
  IF @Level = 0 SET @Return = @Return + '}' + @NL

  RETURN @Return
END
GO
CREATE OR ALTER FUNCTION PrettyJSON (
  @JSON NVARCHAR(MAX)
) RETURNS NVARCHAR(MAX)
AS BEGIN
  RETURN dbo.PrettyJSONInternal(@JSON, '  ', 0, CHAR(13) + CHAR(10), '  ')
END
GO