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