1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
---------------------------------------------------
-----           解析字符串函数                -----
---------------------------------------------------
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 ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
-------------------------------
--  解析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


使用示例:

1
2
3
4
5
6
7
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' )