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
我正在 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