如何在SQL Server 2012中解析json数据?

问题描述 投票:0回答:4

我正在使用 SQL Server 2012。我被分配了一项任务,其中表

JsonText
的一列 (
Sample
) 包含 json 数据。我想通过解析该数据并将其插入到另一个表的列中(
Test
)。我在网上搜索“openjson”在 SQL Server 2016 中受支持。在 SQL Server 2012 中怎么办?

表1:示例

Id JsonText Active 

JsonText

webaddress?{'data':'{"PId": "XXXX","Status": "YES","Name":"XXX","Address":"XXXX","MobileNumber":"xxx"}'}

我只对“PID、地址、手机号码”列感兴趣,而不是全部。

像这样的表测试结构

Id, PID, Address, MobileNumber
sql json sql-server-2012
4个回答
2
投票

艾萨克,您的代码无法使用未引用的值,例如{“isAuthorized”:“false”,“customerID”:null}。我修复了这个问题,你的函数应该如下所示。

ALTER FUNCTION [dbo].[JSON_VALUE]
(
    @JSON NVARCHAR(3000),
    @column NVARCHAR(3000)
)
RETURNS NVARCHAR(3000)
AS
BEGIN

DECLARE @value NVARCHAR(3000);
DECLARE @trimmedJSON NVARCHAR(3000);

DECLARE @start INT;
DECLARE @end INT;

set @start = PATINDEX('%' + @column + '":%',@JSON) + LEN(@column) + 2;
SET @trimmedJSON = SUBSTRING(@JSON, @start, LEN(@JSON));
Set @end = CHARINDEX(',',@trimmedJSON);
SET @value = REPLACE(SUBSTRING(@trimmedJSON, 0, @end),'"','');

RETURN @value
END

0
投票

我创建了一个与 SQL 2012 兼容的函数来处理这个问题

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Isaac Adams
-- Create date: 7/12/2018
-- Description: Give the JSON string and the name of the column from which you want the value
-- =============================================
CREATE FUNCTION JSON_VALUE
(
    @JSON NVARCHAR(3000),
    @column NVARCHAR(3000)
)
RETURNS NVARCHAR(3000)
AS
BEGIN

DECLARE @value NVARCHAR(3000);
DECLARE @trimmedJSON NVARCHAR(3000);

DECLARE @start INT;
DECLARE @length INT;

SET @start = PATINDEX('%' + @column + '":"%',@JSON) + LEN(@column) + 3;
SET @trimmedJSON = SUBSTRING(@JSON, @start, LEN(@JSON));
SET @length = PATINDEX('%", "%', @trimmedJSON);
SET @value = SUBSTRING(@trimmedJSON, 0, @length);

RETURN @value
END
GO

-2
投票
>>> at JSON_VALUE function, at PATINDEX('%", "%', @trimmedJSON);

'%", "%' 

中删除空格

如果你的 JSON 值是这样的

'{"street":"street1","street2":"street232423"}'

-2
投票

您可以在 TSQL 中使用

JSON_VALUE(ColumnName,'$.Path')
来解析 Json

例如:

select JSON_VALUE(webaddress,'$.data.PID') as 'PID',
       JSON_VALUE(webaddress,'$.data.Status') as 'Status',
       JSON_VALUE(webaddress,'$.data.Name') as 'Name'
from test
© www.soinside.com 2019 - 2024. All rights reserved.