SQL Server 分页+json分享

    技术2022-07-10  137

    1。SQL Server 版本2012+ 新增SQL分页的写法

    最近封装一个轻量级的ORM用到了分页,以前只知道使用Row_Number函数,现在发现sqlserver 新增的 {orderBy} offset {start} rows fetch next {pageSize} rows only 也挺好用的。

    简单回顾下 sqlserver 各个版本支持分页的方式。

    SQL Server 2005 支持 top not in 写法

    SQL Server 2008 支持 Row_Number()写法

    SQL Server 2012 支持 OFFSET、FETCH NEXT 写法

    这也就是为什么Efcore连接SQL Server 2012之前的版本进行分页操作会报异常“SqlException: 'OFFSET' 附近有语法错误。在 FETCH 语句中选项 NEXT 的用法无效。”的原因。

    如果要使用2008进行分页需要特殊的配置options.UseRowNumberForPaging();

     OFFSET、FETCH NEXT 写法 取出页码(2)和一页显示的条数(20)的用户数据语句如下

    select * from Sys_UserInfo Order by SysNo asc offset 20 rows fetch next 20 rows only;

    offset 开始的行或者跳过的行 fetch next 取出排序后的多少行,是不是比之前的写法方便多了。

    2。SQL Server 版本2016+ 新增JSON功能

    最近有个需求,用到存储json的又不想使用其他文档数据库,刚好发现SQL Server新增了json功能。来看下简单的验证、检索、编辑功能。

     定义json

    [{ "Code": "UserName", "ShowLable": "用户名", "ShowText": ".NET", "IsShow": 1, "ShowSort": 1 }, { "Code": "RealName", "ShowLable": "真实名称", "ShowText": "知音", "IsShow": 1, "ShowSort": 2 }]

    验证是否是json

    SELECT Id,QueryJson FROM AA_QueryJson where ISJSON(QueryJson)>0

    返回:

    检索json

    SELECT TOP (1000) [Id] ,JSON_VALUE(QueryJson,'$[0].ShowLable') as ShowLable ,JSON_VALUE(QueryJson,'$[0].ShowText') as ShowText FROM [AaCenter].[dbo].[AA_QueryJson] where ISJSON(QueryJson)>0

    返回:

    修改json

    select JSON_MODIFY(QueryJson,'$[0].ShowText', 'dotNET') from [AA_QueryJson];

    返回:

    当然有很多高级的功能如OPENJSON 行集函数可将 JSON 文本转换为一组行和列、嵌套操作等等。

    参考:

    https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2012/ms188385(v=sql.110)?redirectedfrom=MSDN

    https://docs.microsoft.com/zh-cn/sql/t-sql/functions/json-functions-transact-sql?view=sql-server-ver15

    Processed: 0.012, SQL: 9