SQLServer 解析JSON字符串
admin
2023-05-22 12:42:36
0
---------------------------------------------------
-----           解析字符串函数                -----
---------------------------------------------------
CREATE FUNCTION [dbo].[fn_split](@p_str VARCHAR(8000), @p_split VARCHAR(10))
RETURNS @tab TABLE(tid VARCHAR(2000))
AS
BEGIN
DECLARE @idx INT
DECLARE @len INT
SELECT @len = LEN(@p_split), @idx = CHARINDEX(@p_split, @p_str, 1)
WHILE(@idx >= 1)
BEGIN
INSERT INTO @tab SELECT LEFT(@p_str, @idx - 1)
SELECT @p_str = RIGHT(@p_str, LEN(@p_str) - @idx - @len + 1), @idx = CHARINDEX(@p_split, @p_str, 1)
END
if(@p_str <> '') INSERT INTO @tab SELECT @p_str
RETURN
END;
-------------------------------
--  解析JSON字符串  --
-------------------------------
--p_jsonstr json字符串
--p_key 键
--返回p_key对应的值
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 dbo.fn_parsejson(
'{"billPrice":"1.67","buyDate":"2009-12-30","currentStatus":"有租约",
"decoration":"精装","empCode":"174999",","houseId":"F20BEBE259794C858C76122BCBACC71F",
"id":"36398","isAccompany":"0","isCollect":"1","isOnlyOne":"1",
"isShotProperty":"1","noCollectReason":"","parking":"0","propertyNo":"5885109",
"recordDate":"2017-06-08","recordRemark":"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"}'
,'buyDate')


相关内容

热门资讯

美军被曝群发邮件“众筹”对付伊... 据凤凰卫视援引美国有线电视新闻网8月3日报道,美军中央司令部近期在内部广泛征集新的对伊朗施压与惩戒策...
因凡蒂诺求助特朗普保其职位?国... 国际足联媒体部门8月4日在社交媒体平台X回应英国《泰晤士报》报道称,国际足联主席因凡蒂诺近日未同美国...
江西德兴一自来水主管道破裂,城... 8月4日,江西省德兴市一处自来水主管道因施工破裂,现场喷涌出十余米高自来水,目前正在积极抢修。受此影...
制胜|第六集《联战联胜》大图速... 思想解读类融媒体片《制胜》今日收官第六集《联战联胜》震撼上新2016年2月1日习主席向五大战区授予军...
我国经济动能向新结构向优(读数... 四川省达州市通川区北山镇丰登村的麦田间,农民将刚收割的小麦装车。邓良奎摄(人民视觉)数据来源:国家统...
“意大利、德国还好意思指责西班... 一边高调批评西班牙的移民大赦政策“吸引非法移民”,一边却悄悄为本国非法入境者大开绿灯——意大利、德国...
电脑如何与打印机连接 打印机的种类很多,按打印元件对纸是否有击打动作,分击打式打印机与非击打式打印机。那么电脑如何与打印机...
怎么在电脑上添加打印机步骤 在现代社会,打印机是一个非常重要的办公设备,它能够将电子文件转化为实体纸质文件。然而,许多人在次使用...
电脑如何添加打印机驱动程序 电脑在跟打印机一起使用的`时候,我们要在电脑上安装好相应的驱动程序才行。那么电脑如何添加打印机驱动程...
韦唯回忆10年跨国婚姻:完全就... 近日,韦唯直言嫁给瑞典钢琴家完全就是上当,没爱过他。结婚前不知道对方比自己大25岁,表面光鲜的10年...