SqlServer Json解析 函数

自己写的,相目中用到的取某一JSON字段中,某个字字段的值。
SELECT tt.Pat_ID,tt.a,tt.b,tt.a-tt.b AS execCount FROM (
SELECT Pat_ID,
CONVERT(INT,SUBSTRING(
SUBSTRING(
Step_4_Infor,
CHARINDEX(‘Fractions_Tx":’, Step_4_Infor) + 15,
CHARINDEX(’",“ProgressDetail’, Step_4_Infor)
- CHARINDEX('Fractions_Tx”:’, Step_4_Infor) - 15
),
CHARINDEX(’/’,
SUBSTRING(
Step_4_Infor,
CHARINDEX(‘Fractions_Tx":’, Step_4_Infor) + 15,
CHARINDEX(’",“ProgressDetail’, Step_4_Infor)
- CHARINDEX('Fractions_Tx”:’, Step_4_Infor) - 15
)
)+1,LEN(SUBSTRING(
Step_4_Infor,
CHARINDEX(‘Fractions_Tx":’, Step_4_Infor) + 15,
CHARINDEX(’",“ProgressDetail’, Step_4_Infor)
- CHARINDEX('Fractions_Tx”:’, Step_4_Infor) - 15
))

                    ) ) AS a,

          CONVERT(INT, SUBSTRING(
                        SUBSTRING(
                                     Step_4_Infor,
                                     CHARINDEX('Fractions_Tx":', Step_4_Infor) + 15,
                                     CHARINDEX('","ProgressDetail', Step_4_Infor)
                                     - CHARINDEX('Fractions_Tx":', Step_4_Infor) - 15
                                 ),
                        0,
                        CHARINDEX(
                                     '/',
                                     SUBSTRING(
                                                  Step_4_Infor,
                                                  CHARINDEX('Fractions_Tx":', Step_4_Infor) + 15,
                                                  CHARINDEX('","ProgressDetail', Step_4_Infor)
                                                  - CHARINDEX('Fractions_Tx":', Step_4_Infor) - 15
                                              )
                                 )
                    )) AS b

FROM dbo.TreatmentProgress
WHERE PartStatus_Code = 1200 ) tt

–以下是找到的相关函数

CREATE FUNCTION [dbo].[fn_parsejson](@p_jsonstr VARCHAR(8000),
@p_key VARCHAR(200))
RETURNS VARCHAR(3000)
AS
BEGIN
DECLARE @rtnVal VARCHAR(3000);
DECLARE @i INT;
DECLARE @jsonkey VARCHAR(200);
DECLARE @jsonvalue VARCHAR(1000);
DECLARE @json VARCHAR(8000);
DECLARE @tmprow VARCHAR(2000);
DECLARE @tmpval VARCHAR(2000);

IF(@p_jsonstr IS NOT NULL)
BEGIN
SET @json = REPLACE(@p_jsonstr, ‘{’, ‘’);
SET @json = REPLACE(@json, ‘}’, ‘’);
SET @json = REPLACE(@json, ‘"’, ‘’);
DECLARE @json_cur CURSOR; – 声明外层游标
SET @json_cur = CURSOR FOR SELECT tid FROM fn_split(@json, ‘,’);
OPEN @json_cur-- 打开游标(外层游标)
FETCH NEXT FROM @json_cur INTO @tmprow-- 提取外层游标行
WHILE(@@FETCH_STATUS = 0)
BEGIN
IF(@tmprow IS NOT NULL)
BEGIN
SET @i = 0;
SET @jsonkey = ‘’;
SET @jsonvalue = ‘’;

DECLARE @str_cur CURSOR;-- 声明内层游标
SET @str_cur = CURSOR FOR SELECT tid FROM fn_split(@tmprow, ‘:’);–第二次拆分后的游标(内层游标)
OPEN @str_cur – 打开游标
FETCH NEXT FROM @str_cur INTO @tmpval-- 提取内层游标行

WHILE(@@FETCH_STATUS = 0)
BEGIN
IF(@i = 0)
BEGIN
SET @jsonkey = @tmpval
END
IF(@i = 1)
BEGIN
SET @jsonvalue = @tmpval
END

SET @i = @i + 1

FETCH NEXT FROM @str_cur into @tmpval-- 内层游标下移一行
END

CLOSE @str_cur-- 关闭内层游标
DEALLOCATE @str_cur – 释放内层游标

IF(@jsonkey = @p_key)
BEGIN
SET @rtnVal = @jsonvalue
END
END

FETCH NEXT FROM @json_cur INTO @tmprow-- 内层游标结束后,外层游标下移一行
END

CLOSE @json_cur-- 关闭外层游标
DEALLOCATE @json_cur-- 释放外层游标
END

RETURN @rtnVal
END

–SELECT * FROM [dbo].[TreatmentProgress]
–使用
SELECT dbo.fn_parsejson(Step_4_Infor,‘Fractions_Tx’) FROM [dbo].[TreatmentProgress] WHERE PartStatus_Code=1200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值