【问题标题】:How to parse json data in SQL Server 2012?如何在 SQL Server 2012 中解析 json 数据?
【发布时间】:2016-12-12 06:03:30
【问题描述】:

我正在使用 SQL Server 2012。我被分配了一项任务,其中我的表 Sample 的一列 (JsonText) 包含 json 数据。我想传递解析该数据并插入另一个表的列(Test)。我在网上搜索到 SQL Server 2016 支持“openjson”。在 SQL Server 2012 中如何做?

表 1:示例

Id JsonText Active 

JsonText

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

我只对 'PID,Address,MobileNumber' 列感兴趣。

这样的表测试结构

Id, PID, Address, MobileNumber

【问题讨论】:

  • 检查this。抱歉,这是 2016 年的,您需要 2012 年的。忽略此评论。
  • 找到了this 可以解决你的问题(没查过,但看起来是合理的解决方案)。
  • 在 2016 年之前,您需要像 this one 这样的专业脚本,或者我相信使用 CLR。看看这些以前的 SO 问题及其答案:Parse JSON string in sqlParse JSON in TSQL
  • Parse JSON in TSQL的可能重复

标签: sql json sql-server-2012


【解决方案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

【讨论】:

  • 我也在使用你同样的功能,但我无法得到结果。SELECT dbo.JSON_value('{street:"street1",street2:"street232423"}','street' )。它需要给值 stree1,但它给空值
【解决方案2】:

Isaac 您的代码不适用于未引用的值,例如{"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

【讨论】:

    【解决方案3】:
    >>> at JSON_VALUE function, at PATINDEX('%", "%', @trimmedJSON);
    

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

    如果你的 JSON 值是这样的

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

    【讨论】:

      【解决方案4】:

      你可以在TSQL中对Json使用JSON_VALUE(ColumnName,'$.Path'),例如:

      select JSON_VALUE(webaddress,'$.data.PID') as 'PID',
             JSON_VALUE(webaddress,'$.data.Status') as 'Status',
             JSON_VALUE(webaddress,'$.data.Name') as 'Name'
      from test
      

      【讨论】:

      猜你喜欢
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多