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

时间:2016-12-12 06:03:30

标签: sql json sql-server-2012

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

4 个答案:

答案 0 :(得分:1)

我创建了一个与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

答案 1 :(得分:0)

以撒,您的代码无法使用未引用的值,例如{“ 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

答案 2 :(得分:-1)

>>> at JSON_VALUE function, at PATINDEX('%", "%', @trimmedJSON);

'%", "%' 中删除空格

如果您的 JSON 值类似于

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

答案 3 :(得分:-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