找回密码
 立即注册

QQ登录

只需一步,快速开始

咖啡里 讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2020-9-2 03:44  /   查看:10171  /  回复: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数据存取解决方案了。
回复 使用道具 举报
1818himis悬赏达人认证 活字格认证
高级会员   /  发表于:2020-9-2 10:00:38
板凳
现在服务端命令可以执行存储过程,加上页面表格不绑定表和Json格式自动填充表格,综合起来感觉活字格应该可以一步到位处理存储过程返回结果集到表格了,或者出官方插件处理,这样不是更友好
回复 使用道具 举报
咖啡里讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2020-9-3 00:05:44
地板
dystar001 发表于 2020-9-2 23:27
再给有兴趣的格友一个思路:

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

这个就是通用的存储过程。定义一个传入的参数,这个参数就是要查询表的SELECT拼接语句,只要期初把这个通用的存储过程放到数据库里面。随时要查哪个表就把这个表的SELECT拼接语句传进去即可,后期只要有权限调用这个存储过程就可以执行,不用每一个查询都写一次。屡试屡爽!
回复 使用道具 举报
咖啡里讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2020-9-3 03:52:51
5#
测试了一下高版本sql server自带的JSON功能更给力(2016后面的版本含2016支持)。建议大家还是使用高版本,整体速度以倍数增加。
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2020-9-3 10:12:54
6#
牛皮啊~~~
回复 使用道具 举报
feng2575悬赏达人认证 活字格认证
金牌服务用户   /  发表于:2020-9-3 10:24:22
7#
流弊
回复 使用道具 举报
sz_xd
金牌服务用户   /  发表于:2020-9-3 10:50:13
8#
本帖最后由 sz_xd 于 2020-9-3 11:07 编辑

非常感谢无私分享!
请问楼主:你附件中 json.bak 是怎么使用?烦请指教,谢谢!
回复 使用道具 举报
咖啡里讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2020-9-3 11:53:30
9#
sz_xd 发表于 2020-9-3 10:50
非常感谢无私分享!
请问楼主:你附件中 json.bak 是怎么使用?烦请指教,谢谢!

这个是sql2008的数据库完整备份,最低恢复到同一版本或更高版本即可!
回复 使用道具 举报
遇见未知的自己
银牌会员   /  发表于:2020-9-3 11:55:36
10#
咖啡里 发表于 2020-9-3 03:52
测试了一下高版本sql server自带的JSON功能更给力(2016后面的版本含2016支持)。建议大家还是使用高版本, ...

SQL2106以下版本才用这个参数FOR XML,SQL2016以上的版本的可以直接使用FOR JOSN
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部