mysql 动态sql 解析json数据_在SQL 中生成JSON数据

这段时间接手一个数据操作记录的功能,刚拿到手上的时候打算用EF做,后来经过仔细考虑最后还是觉定放弃,最后思考再三决定:

1、以模块为单位分表、列固定(其实可以所有的操作记录都放到同一个表,但是考虑到数据量大的时候查询性能的问题还是分表吧)列:主键ID、引用记录主键ID、操作时间、操作类型、详细信息(里面存储的就是序列化后的值)

2、在客服端解析保存的序列化的值

但是用xml还是用json呢,这有是一个问题,显然用xml在存储过程正很容易就能生成了:SELECT * FROM TABLE FOR XML AUTO 就ok了,

但是用xml的话,在客服端解析就麻烦些了,所以弃用了xml保存,而使用了最爱的json,现在的问题就是写一个通用的存储过程来生成json了,经过我1天多的拼写终于出炉了(其实难度不大,就是拼字符串容易出错)

/*=================获取JSON格式数据

@TableName varchar(100):表名

@ColumnIn nvarchar(100):列名,用于判断,

@ColumnValues nvarchar(max):值'aaa,bbb,ccc',

@Condition NVARCHAR(max):条件(and 1=1)

@Json varchar(max) OUTPUT:生成的JSON数据

@Limit int =NULL :取前多少条,为null 取所有

@ConvertColumns NVARCHAR(max)=null:要转换的列(目前已经排除为nvarchar(max)的列)

==================================*/

create PROC uspGetJSON(

@TableName varchar(100),

@ColumnIn nvarchar(100)='',

@ColumnValues nvarchar(max),

@Condition NVARCHAR(max)='',

@Json varchar(max) OUTPUT,

@Limit int =NULL,

@ConvertColumns NVARCHAR(max)=null

--@SortColumn nvarchar(100)=null,

--@SortType nvarchar(10)='asc'

)

AS

--if(@SortColumn is null)

--set @SortColumn='LastModifiedDate'

declare @query varchar(max),

@table_schema varchar(max) = null

if(charindex('.', @TableName) > 0 )

begin

set @table_schema = replace(replace( substring(@TableName, 0, charindex('.',@TableName)), '[', ''), ']', '')

set @TableName = replace(replace( substring(@TableName, charindex('.',@TableName) + 1,len(@TableName)), '[', ''), ']', '')

END

IF EXISTS ( SELECT 1 FROM tempdb..sysobjects WHERE id = OBJECT_ID('tempdb..#tmpJsonTable') )

DROP TABLE #tmpJsonTable

CREATE TABLE #tmpJsonTable

(

json NVARCHAR(max) NULL

)

--"dd"

set @query =

'insert into #tmpJsonTable select ' + case when @Limit is not null then 'top ' + cast(@Limit as varchar(32)) + ' ' else '' end + '''{ '' + REVERSE(STUFF(REVERSE(''' +

CAST((SELECT ' "' + column_name + '" : ' +

----处理为null的问题

case WHEN is_nullable = 'YES' then ''' + case when [' + column_name + '] is null then ''null'' else ' +

--处理前缀"

case WHEN data_type='uniqueidentifier'or data_type like '%date%' or data_type like '%char%' or data_type like '%text%' then '''"'' + ' else '' end +

/*类型转换*/

case WHEN data_type like '%date%' then 'convert(varchar(23),[' + column_name + '], 20)+ ''"'''

else 'replace(replace(replace(replace(replace(cast([' + column_name + '] as varchar(max)),''\'',''\\''),''"'',''\"''),char(10),''\n''),char(13),''\n''),char(9),''\t'') ' end +

--处理后缀"

case WHEN data_type='uniqueidentifier' or data_type like '%char%' or data_type like '%text%' then '+ ''"''' else '' end + ' end + '''

ELSE

--处理前缀"

case WHEN data_type='uniqueidentifier' or data_type like '%date%' or data_type like '%char%' or data_type like '%text%' then '"' else '' end + ''' + ' +

/*类型转换*/

case WHEN data_type like '%date%' then 'convert(varchar(23),[' + column_name + '], 20)+ '''

else 'replace(replace(replace(replace(replace(cast([' + column_name + '] as varchar(max)),''\'',''\\''),''"'',''\"''),char(10),''\n''),char(13),''\n''),char(9),''\t'') + ''' end +

--处理后缀"

case WHEN data_type='uniqueidentifier'OR data_type LIKE 'date%' or data_type like '%char%' or data_type like '%text%' then '"' else '' end end + ','

AS [text()]

from information_schema.columns

where table_name = @TableName

and (character_maximum_length IS NULL OR character_maximum_length!=-1)

AND(@ConvertColumns IS NULL OR COLUMN_NAME IN(SELECT MyValues FROM dbo.funSplitArray(@ConvertColumns,',')))

and (@table_schema is null or table_schema = @table_schema) FOR XML PATH('') ) as varchar(max)) +

'''),1,1,'''')) + '' }'' as json from ' + @TableName + ' with(nolock) where ('+@ColumnIn+' in (Select MyValues from dbo.funSplitArray('''+@ColumnValues+''','',''))) '+@Condition--+' ORDER BY '+@SortColumn+' '+@SortType

exec sp_sqlexec @query

--SELECT @query

set @Json =

--'{' + char(10) + char(9) +

--'"recordCount" : ' + Cast((select count(*) from #tmpJsonTable) as varchar(32)) + ',' + char(10) + char(9) +

--'"records" : ' + char(10) + char(9) + char(9) +

'[' + char(10)

+ REVERSE(STUFF(REVERSE(CAST((SELECT char(9) + char(9) + json + ',' + char(10) AS [text()] FROM #tmpJsonTable FOR XML PATH('')) AS varchar(max))),1,2,''))

+ char(10) + char(9) + char(9) + ']'

-- + char(10) + '}'

drop table #tmpJsonTable

--DECLARE @table_name varchar(100)='SalesOrder',

-- @ConvertColumns NVARCHAR(max)='SalesOrderNo,SalesOrderID',

-- @Condition NVARCHAR(max)='',

-- @json varchar(max)

--EXEC GetJSON @table_name=@table_name,@ConvertColumns=@ConvertColumns,@Condition=@Condition,@json=@json OUTPUT

--SELECT @json

调用这个存储过程使用输出参数就可以得到序列化后的json数据了。

至此,就差在客服端解析了。打算写个方法根据传递过来的json对象参数来动态解析,这样 ui页面上也不需要用每个地方都去解析了....

--用到的自定义函数

CREATE function [dbo].[funSplitArray](@aString varchar(max),@pattern varchar(10))

returns @temp table([Sid] [int] IDENTITY (1, 1) NOT NULL ,Myvalues varchar(100))

--实现split功能的函数

--说明:@aString,字符串,如“27,28,29”;@pattern,分隔标志,如“ ,”

--使用select Myvalues FROM my_split(字符串, ',')

as

begin

declare @i int

set @aString=rtrim(ltrim(@aString))

set @i=charindex(@pattern,@aString)

while @i>=1

begin

insert @temp values(left(@aString,@i-1))

set @aString=substring(@aString,@i+1,len(@aString)-@i)

set @i=charindex(@pattern,@aString)

end

if @aString<>''

insert @temp values(@aString)

return

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft Edge 浏览器开始支持webkit私有样式

微软表示新版的浏览器Edge(spartan)不会再增加新的私有属性&#xff0c;同时移除了部分-ms-属性&#xff0c;但很多标准在没有支持到之前&#xff0c;会使用webkit的api。Edge开发工程师Jacob Rossi列出了一份Edge所支持的webkit api列表。 CSS Core webkitBackgroundwebkitBac…

cemtos7上mysql8两个实例_centos7上配置mysql8的双主互写

注意:1、主库1&#xff1a;10.1.131.75&#xff0c;主库2&#xff1a;10.1.131.762、server-id必须是纯数字&#xff0c;并且主从两个server-id在局域网内要唯一。【主节点1】vi /etc/my.cnf[mysqld]log-binmysql-binserver-id2019001log_slave_updates1重启服务service mysqld…

不属于python数据类型的是_Python不支持的数据类型有( )。

(2) 完成划线处的代码填空: Dim classname(1 To 8000) As String 存储原始数据中的班级名称 Dim selectabc(1 To 8000) As String 存储原始数据选项的值 Dim xiangmu(1 To 8000) As String 存储原始数据选项的序号 Dim n As Integer Private Sub Command…

【Daily Scrum】12-08

因为TFS的一些问题&#xff0c;到现在一直都看不了Sprint 3的burndown and burn rate. 今天的scrum发现这个Sprint期间大家组里的事情都比较多&#xff0c;不过大家还是有很努力地在晚上和周末来完成ASC Master的任务&#xff0c;辛苦~ Member Today’s WorkTomorrow’s WorkFe…

java 字符串转成图片_java 转换图片为字符串,将字符串转换成图片显示

java 转换图片为字符串&#xff0c;将字符串转换成图片显示&#xff0c;该方法只适用于比较小的图片传输&#xff0c;50K以内&#xff1a;try{// 将图片转换成字符串File imgFile new File("f:\\Vista.png");FileInputStream fis new FileInputStream( imgFile );b…

图片延迟加载和滑动翻页

一&#xff1a;预加载 首先&#xff0c;我们需要引用JS&#xff0c; <script src"/Scripts/JQuery.LazyLoad.js"></script>其次&#xff0c;修改img的格式为&#xff1a; <img data-original"/images/img01.png" src"/images/grey.gif…

基本上,把switch,用设计模式代替,肯定是bug和过度设计。想想,本来修改一个文件几行代码可以解决的问题,变成修改3-6个类才能实现一样的功能。不是傻是什么?...

那些迷信设计模式的人&#xff0c;来修改一下这个方法吧。看看你最终的代码膨胀为几倍。。。 1 public virtual PasswordChangeResult ChangePassword(ChangePasswordRequest request)2 {3 if (request null)4 throw new ArgumentNullException(&qu…

inotify-tools、sersync配置及压力测试

一、Inotify介绍&#xff1a; Inotify 是一个 Linux 内核特性&#xff0c;它监控文件系统&#xff0c;并且及时向专门的应用程序发出相关的事件警告&#xff0c;比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。使用 inotify 很简单&#xff1a;创建一个文…

java jml_JML 入门

【IT168 技术文章】面向对象分析和设计的原则之一就是应当尽可能地把过程设想往后推。我们大多数人只在实现方法之前遵守这一规则。一旦确定了类及其接口并该开始实现方法时&#xff0c;我们就转向了过程设想。那么到底有没有别的选择?和大多数语言一样&#xff0c;编写 Java …

转移指令检测题9

补全编程&#xff0c;利用loop指令&#xff0c;实现在内存2000H段中查找第一个值为0的字节&#xff0c;找到后&#xff0c;将它的偏移地址存储在DX中 assume cs:code code segment start:mov ax,2000h mov ds,ax mov bx,0 s: mov cl,[bx] mov ch,0 inc cx ;此处为要…

c语言 java append_C++中append函数的用法和函数定义。谢谢!

展开全部要想使用标准C中string类&#xff0c;必须要包含#include // 注意是&#xff0c;不62616964757a686964616fe78988e69d8331333339663434是&#xff0c;带.h的是C语言中的头文件using std::string;using std::wstring;或using namespace std;下面你就可以使用string/wstr…

PHP array_flip() array_merge() array+array的使用总结

array_flip(array); //传递一个数组参数&#xff0c;对该数组的键、值进行翻转 例如&#xff1a; $a array(a,b,c ); print_r(array_flip($a));//输出为&#xff1a; Array ([a] > 0[b] > 1[c] > 2 )//需要注意的是&#xff1a; array_flip(): Can only flip STRING …

很好用的程序员在线画图软件

今天向大家推荐一个很好用的在线画图软件&#xff1a;今天向大家推荐一个很好用的在线画图软件&#xff1a;今天向大家推荐一个很好用的在线画图软件&#xff1a;&#xff08;重要的事情说三篇&#xff09;连接地址如下&#xff1a;https://www.processon.com/i/55e3195de4b0df…

java breakpoint_java断点

第一步&#xff1a;用firefox运行程序&#xff0c;当点击保存&#xff0c;提示保存失败后&#xff0c;启动firebug通过请求找到addNew.ezt出现错误&#xff0c;在eztnews.xml里通过ctrlF查找找到请求执行的类和方法找到NewsAction类的doAddNew方法然后在通过找到NewsActions.ja…

1)C++对象大小计算

C对象的大小不同的编译器的实现是不一样的&#xff0c;以下仅讨论.net2003&#xff0c;其他编译的可能出现的结果以下也做了分析和猜测。在反推不同编译器实现的C对象的大小时。对齐是一个很重要也容易被遗忘的问题。class A{}; 类A是一个空类&#xff0c;但是它的大小并不…

OC之ARC环境中的循环strong问题

2019独角兽企业重金招聘Python工程师标准>>> main.m文件&#xff1a; #import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h"int main() {Person *p [[Person alloc] init];Dog *d [[Dog alloc] init];p.dog d;d.per…

java metric_java版的Metric工具介绍

Metrics是一个给JAVA服务的各项指标提供度量工具的包&#xff0c;在JAVA代码中嵌入Metrics代码&#xff0c;可以方便的对业务代码的各个指标进行监控&#xff0c;同时&#xff0c;Metrics能够很好的跟Ganlia、Graphite结合&#xff0c;方便的提供图形化接口。基本使用方式直接将…

15_采用Pull解析器解析和生成XML内容

java还提供SAX和DOM用于解析XML Android还集成了Pull解析器——推荐 package cn.itcast.service;import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1…

Android自定义view之圆形进度条

本节介绍自定义view-圆形进度条思路&#xff1a;根据前面介绍的自定义view内容可拓展得之&#xff1b;1&#xff1a;新建类继承自View2&#xff1a;添加自定义view属性3&#xff1a;重写onDraw(Canvas canvas)4&#xff1a;实现功能下面上代码1.自定义view代码&#xff1a; pub…

java二级考试备考_2017计算机二级考试《JAVA》备考测试题「带答案」

2017计算机二级考试《JAVA》备考测试题「带答案」为确保同学们将所涉及的考点全面复习到位&#xff0c;让大家充满信心的步入考场&#xff0c;以下是百分网小编搜索整理的一份计算机二级考试《JAVA》备考测试题【带答案】&#xff0c;供参考练习&#xff0c;希望对大家有所帮助…