这段时间接手一个数据操作记录的功能,刚拿到手上的时候打算用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

在SQL 中生成JSON数据的更多相关文章

  1. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  2. 截取HTML中的JSON数据并利用GSON进行解析(Android)

    截取HTML中的JSON数据并利用GSON进行解析(Android) 前言 最近在做的一个Android项目,需要自行搭建服务器,队友选择买了阿里云的服务器ESC产品,在数据获取上,我们采用了Andr ...

  3. servlet生成json数据返回至Ajax

    一.JSON JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的符号标 ...

  4. PHP中生成json信息的方法

    <?php //php中生成json信息 //json_encode(数组/对象) $color = array('red','blue','green'); //[索引数组] echo jso ...

  5. sql 中实现打乱数据的排序

    sql 中实现打乱数据的排序    order by NEWID()就实现了数据的打乱 

  6. 生成JSON数据--fastjson(阿里)方法

    fastjson(阿里)方法生成JSON数据: 与Gson类似,创建相应类,再使用JSON.toJSONString()添加对象 要求:生成如下JSON数据 1.{"age":3, ...

  7. 生成JSON数据--Gson(谷歌)方法

    Gson生成JSON数据方法: 创建相应的类,然后创建对象,toJson()进去就可以了 要求:生成如下JSON数据 1.{"age":4,"name":&qu ...

  8. 关于mysql中存储json数据的读取问题

    在mysql中存储json数据,字段类型用text,java实体中用String接受. 返回前端时(我这里返回前端的是一个map),为了保证读取出的数据排序错乱问题,定义Map时要用LinkedHas ...

  9. JMeter 中对于Json数据的处理方法

    JMeter中对于Json数据的处理方法 http://eclipsesource.com/blogs/2014/06/12/parsing-json-responses-with-jmeter/ J ...

随机推荐

  1. ubuntu 源码安装 swig

    1. 下载 swig 源码 http://www.swig.org/survey.html 填写一个简单的问卷,即可进入 sourceforge 下载. 2. 安装 g++ sudo apt-get ...

  2. PHP开发APP接口

    第1章 APP接口简介 - 课程简介 (:) - APP接口介绍 (:) - 客户端APP通信 (:) 最近学习 - 客户端APP通信格式区别 (:) - APP接口做的哪些事儿 (:) 第2章 封装 ...

  3. python 在 for i in range() 块中改变 i 的值的效果

    先上一段代码: for i in range(3): i = 2 print(i) 实际结果是: 2 2 2 可以发现实际效果就是 在每次执行 for 语句块的内容后 i 会被重新赋值

  4. Git安装及基本使用

    准备: Git软件,github账号. Git安装: 直接百度搜git下载,windows和mac不同平台的.官网上的下载地址很慢或者根本下不了. 默认配置安装. github: 网址:https:/ ...

  5. uva 10548 - Find the Right Changes(拓展欧几里得)

    题目链接:uva 10548 - Find the Right Changes 题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解. 解题思路:拓展欧几里得,保证x,y均大于等于0, ...

  6. Android适配器Adapter学习

    在开发中我们需要绑定一些数据展现到桌面上,这是就需要AdapterView.AdapterView是ViewGroup的子类,它决定了怎么展现视图通过Adapter来绑定特殊的数据类型. Adapte ...

  7. Android 类似未读短信图标显示数字效果的分析

    之前一直以为是应用本身在对图标进行修改,看了源码之后发现其实主要的工作并不是应用自己完成的,主要的工作在是launcher里面完成的. 关于系统里面类似未读短信的具体处理流程如下, 原理 一个应用要实 ...

  8. Android仿人人客户端(v5.7.1)——个人主页(三)

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/9405089 声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用,编 ...

  9. linux内核之网络协议栈

    https://www.ibm.com/developerworks/cn/linux/l-ntflt/

  10. linux定时任务crontab的设置

    linux定时任务crontab的设置http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cronta ...