找回密码
 立即注册

QQ登录

只需一步,快速开始

咖啡里 讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2020-9-2 03:44  /   查看:10454  /  回复:20
本帖最后由 咖啡里 于 2020-9-2 03:48 编辑

活字格的功能越来越强大,前两天发布了内测版6.0.100,增加了不少强大的功能,其中JSON功能感觉不错,所以就测试的时候顺便玩玩。之前使用存储过程返回的结果集一直使用XML的方式再解析到表,由于XML所生成的字符传过长,查询结果过多时还明显感觉到速度会有所减弱,相比JSON返回的序列就简洁得多。按理应该有所提升(个人理解,没有测试过),当然下面的方法也是从sqlserver查询中取得XML再拼接生成的JSON返回来的序列,这种做法在数据库处理的速度上大大优于页面的处理。
QQ图片20200902032344.png
存储过程
QQ图片20200902032956.png
  1. -- =============================================
  2. -- Author:                Lee lin
  3. -- Create date: 2020-9-2 02:31:16
  4. -- Description:        json_text
  5. -- =============================================
  6. CREATE PROCEDURE Pm_json_text
  7. (@jsontext NVARCHAR(MAX) OUT )

  8. AS
  9. BEGIN
  10.   
  11. DECLARE @SQL NVARCHAR(MAX)
  12. DECLARE @XMLString VARCHAR(MAX)
  13. DECLARE @XML XML
  14. DECLARE @Paramlist NVARCHAR(1000)
  15. SET @Paramlist = N'@XML XML OUTPUT'
  16. SET @SQL = 'WITH PrepareTable (XMLString)'
  17. SET @SQL = @SQL + 'AS('
  18. SET @SQL = @SQL + 'SELECT [A_A] AS AA,[B_A] AS BB,[C_A] AS CC FROM [dbo].[Table_JSON]'+ 'FOR XML RAW,TYPE,ELEMENTS'
  19. SET @SQL = @SQL + ')'
  20. SET @SQL = @SQL + 'SELECT @XML=[XMLString]FROM[PrepareTable]'
  21. EXEC sp_executesql @SQL, @Paramlist, @XML=@XML OUTPUT
  22. SET @XMLString=CAST(@XML AS VARCHAR(MAX))
  23.   
  24. DECLARE @JSON VARCHAR(MAX)
  25. DECLARE @Row VARCHAR(MAX)
  26. DECLARE @RowStart INT
  27. DECLARE @RowEnd INT
  28. DECLARE @FieldStart INT
  29. DECLARE @FieldEnd INT
  30. DECLARE @KEY VARCHAR(MAX)
  31. DECLARE @Value VARCHAR(MAX)
  32.   
  33. DECLARE @StartRoot VARCHAR(100);SET @StartRoot='<row>'
  34. DECLARE @EndRoot VARCHAR(100);SET @EndRoot='</row>'
  35. DECLARE @StartField VARCHAR(100);SET @StartField='<'
  36. DECLARE @EndField VARCHAR(100);SET @EndField='>'
  37.   
  38. SET @RowStart=CharIndex(@StartRoot,@XMLString,0)
  39. SET @JSON=''
  40. WHILE @RowStart>0
  41. BEGIN
  42.     SET @RowStart=@RowStart+Len(@StartRoot)
  43.     SET @RowEnd=CharIndex(@EndRoot,@XMLString,@RowStart)
  44.     SET @Row=SubString(@XMLString,@RowStart,@RowEnd-@RowStart)
  45.     SET @JSON=@JSON+'{'
  46.   
  47.     -- for each row
  48.     SET @FieldStart=CharIndex(@StartField,@Row,0)
  49.     WHILE @FieldStart>0
  50.     BEGIN
  51.         -- parse node key
  52.         SET @FieldStart=@FieldStart+Len(@StartField)
  53.         SET @FieldEnd=CharIndex(@EndField,@Row,@FieldStart)
  54.         SET @KEY=SubString(@Row,@FieldStart,@FieldEnd-@FieldStart)
  55.         SET @JSON=@JSON+'"'+@KEY+'":'
  56.         -- parse node value
  57.         SET @FieldStart=@FieldEnd+1
  58.         SET @FieldEnd=CharIndex('</',@Row,@FieldStart)
  59.         SET @Value=SubString(@Row,@FieldStart,@FieldEnd-@FieldStart)
  60.         SET @JSON=@JSON+'"'+@Value+'",'
  61.   
  62.         SET @FieldStart=@FieldStart+Len(@StartField)
  63.         SET @FieldEnd=CharIndex(@EndField,@Row,@FieldStart)
  64.         SET @FieldStart=CharIndex(@StartField,@Row,@FieldEnd)
  65.     END   
  66.     IF LEN(@JSON)>0SET @JSON=SubString(@JSON,0,LEN(@JSON))
  67.     SET @JSON=@JSON+'},'
  68.     --/ for each row
  69.   
  70.     SET @RowStart=CharIndex(@StartRoot,@XMLString,@RowEnd)
  71. END
  72. IF LEN(@JSON)>0SET @JSON=SubString(@JSON,0,LEN(@JSON))
  73. SET @JSON='['+@JSON+']'
  74. SELECT @jsontext=@JSON
  75.   
  76. END
  77. GO
复制代码
设置存储过程
QQ图片20200902033222.png

设置json导入命令
QQ图片20200902033434.png

几步就完成。看效果
json.gif

      Document.fgcc (158.83 KB, 下载次数: 215)

评分

参与人数 7金币 +2000 满意度 +30 收起 理由
13794930121 + 5
亿度 + 5
afore + 5 很给力!
sz_xd + 5 很给力! 非常感谢分享!
Simon.hu + 2000 很给力!
amtath + 5
1818himis + 5 赞一个!

查看全部评分

20 个回复

正序浏览
dystar001悬赏达人认证
高级会员   /  发表于:2020-9-2 23:27:55
推荐
再给有兴趣的格友一个思路:

楼主的方法很好,不过还有一点点缺点,那就是要到数据库后台里面去写一个存储过程,
一旦这个储存过程需要修改,那也必须要连到数据库后台。如果客户的项目不允许我们远程维护,那就比较麻烦了。

那有没有方法可以在用sql语法,让活字格可以得到任意的返回值呢?答案一定是可以的。

思路:
1)建立一个表,2列:sql方案名称,sql代码
2)用c#做一个服务器api,可以接收用活字格post发过来的sql代码,作为参数,然后在api中执行sql,得到返回值后,再回传给活字格。(sql的返回值有两个格式json和xml,如果是新版sql,建议大家直接用json了,老版本的好像只支持xml)
3)得到回传值后,如果是json的,可以直接利用楼主的方式。如果是xml的方式,需要自己
写js解析。
最后再写个页面,可以直接修改这个sql方案表。这样就可以变成一个万能sql数据存取解决方案了。
回复 使用道具 举报
dystar001悬赏达人认证
高级会员   /  发表于:2021-5-3 16:12:57
22#
sz_xd 发表于 2021-5-2 20:04
@dystar001 :   你这提供这思路是非常好及正确的 (发现你喜欢搞动态功能,这是一劳永逸做法),这是可以 ...

是的,这种方案尽量用动态来解决,第一次麻烦点,但是以后是100%复用的。
我们内部管这个方案叫"万能SQL“,不局限具体功能,只要传SQL代码就好了。
回复 使用道具 举报
sz_xd
金牌服务用户   /  发表于:2021-5-2 20:04:58
21#
dystar001 发表于 2020-9-2 23:27
再给有兴趣的格友一个思路:

楼主的方法很好,不过还有一点点缺点,那就是要到数据库后台里面去写一个存 ...

@dystar001 :   你这提供这思路是非常好及正确的 (发现你喜欢搞动态功能,这是一劳永逸做法),这是可以实现的,用 服务器 Web API  中的C# DLL 生产 的动态代码 执行 动态SQL 再 返回值 或动态生成 Json  ,再将这值传回给活字格,经实践发现这也是非常快的,
回复 使用道具 举报
felix1632
高级会员   /  发表于:2020-12-13 23:51:34
20#
dystar001 发表于 2020-9-2 23:27
再给有兴趣的格友一个思路:

楼主的方法很好,不过还有一点点缺点,那就是要到数据库后台里面去写一个存 ...

这个方案的API怎么写?能否按楼主的demo改写下发个出来?谢谢分享
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2020-9-11 15:49:07
19#
回复 使用道具 举报
dystar001悬赏达人认证
高级会员   /  发表于:2020-9-5 15:03:53
18#
咖啡里 发表于 2020-9-3 00:05
这个就是通用的存储过程。定义一个传入的参数,这个参数就是要查询表的SELECT拼接语句,只要期初把这个通 ...

抱歉,前面没有仔细看您的存储过程代码。
您这个存储过程,的确是只要把sql查询的这段语句分解出来,这个就可以变成一个万能的存取方案了。
建议您把demo改一下,加上sql数据参数部分。这样格友看上去会更理解。
否则一开始可能会认为,这个demo只是分解数据用的。


回复 使用道具 举报
咖啡里讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2020-9-4 16:50:12
17#
Simon.hu 发表于 2020-9-4 09:20
我李总每次都是这么无私奉献~

李总,我们等你的蓝牙打印哈~

这是要约吗
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2020-9-4 09:20:59
16#
我李总每次都是这么无私奉献~

李总,我们等你的蓝牙打印哈~
回复 使用道具 举报
sz_xd
金牌服务用户   /  发表于:2020-9-3 20:08:36
14#
咖啡里 发表于 2020-9-3 11:53
这个是sql2008的数据库完整备份,最低恢复到同一版本或更高版本即可!

非常感谢回复指教,谢谢!
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2020-9-3 17:50:19
13#
是的,主要是以前主流的是xml现在主流的是json
回复 使用道具 举报
咖啡里讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2020-9-3 11:59:39
12#
遇见未知的自己 发表于 2020-9-3 11:55
SQL2106以下版本才用这个参数FOR XML,SQL2016以上的版本的可以直接使用FOR JOSN

是的,sql2016版本; SELECT [A_A] AS AA,[B_A] AS BB,[C_A] AS CC FROM [Table_JSON]  for json auto
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部