在存储过程输入输出参数中使用json

Sql Server 从 2016 开始支持 json 操作,JSON支持适用于 SqlServer 2016 及以上版本 和 Azure SQL Database。sqlserver文档参考这里

有了这个json支持,默认过程只传入一个json字符串参数就可以了,方便很多。我们可以在内部做很多事情。甚至可以校验参数,鉴权或将结果集封装为标准的前后端json({code,msg,data})格式。这样等于是前端直接进校了透传,业务变化,中间层也不用改动。

JSON 相关的方法:
判断一段字符串是否是标准的 json(ISJSON
直接查询数据成 json 格式(FOR JSON PATH) ,类似于之前的查询一个 xml (FOR XML PATH),
查询一个 json 对象的值(JSON_VALUE)
查询一个 json 数组值JSON_QUERY
更新一段JSON的内容,修改 JSON 对象里的属性值,删除 JSON 对象里的某一个属性,增加属性,JSON_MODIFY
解析一段 json 内容 (OPENJSON)

 

定义一个简单的过程:

ALTER PROCEDURE [dbo].[SPABC] (  @Param VARCHAR(4000))
AS
BEGIN

    SELECT json_value(@Param,'$.NAME')

END

参数Param是json格式字符串,作为入参,在过程内被解析使用。

 

navicat客户端执行过程

 或

 区别在于数据格式不一样。

 

修改过程,查询结果集并转为json输出

ALTER PROCEDURE [dbo].[SPABC] (  @Param VARCHAR(4000))
AS
BEGIN
    -- SELECT json_value(@Param,'$.NAME')

      DECLARE @Name NVARCHAR(MAX) --定义一个内部变量接收json内部字段数据
      set @Name=json_value(@Parms,'$.NAME') --设置值

    -- 。。。内部使用变量。。。
  -- select @Name as name SELECT
* from Sys_Users for json auto --此处不能使用WITHOUT_ARRAY_WRAPPER,否则代码里转换出错,格式不对 END


C#代码:

//注意,此处res有可能为多行json字符串格式,需要连接并转json对象
var res = execSPDAO.ExecUserSpDataTable(spName, param);
StringBuilder stringBuilder = new StringBuilder();
foreach(DataRow dr in res.Rows)
{
stringBuilder.Append(dr[0]);
}
var obj = JsonConvert.DeserializeObject(stringBuilder.ToString());
return new { code = 0, msg = "查询成功", data = obj };

 

 

posted @ 2024-07-16 22:34  love/coder  阅读(38)  评论(0编辑  收藏  举报