文章类型: DATABASE
关键词: sql,查询,存储过程,select,时间,条件,排序,分页,例子,代码
内容摘要: 发一个带分页的复杂sql存储过程查询

带分页的复杂sql存储过程查询例子代码

2018/8/29 9:41:43    来源:apple    阅读:

需求内容描述:

为了帮助客户更好地管理样本,快速地了解样本信息的存储情况,使用情况,能够方便地进行样本信息的登记、使用、(多条件下的组合)查询(样本信息、出库信息)、修改、删除、打印、导出(可选择导出至Excel中)等功能,另外需具备软件使用授权(通过登录、权限管理)。

样本的仓储结构:设备级(一级,即顶级),设备下可以进行分区(二级,譬如:A设备分为1,2,3,4区),分区下可以多个提桶(三级,譬如:1分区下有1,2,3号提桶),提桶下又可以进行分层(四级,譬如:1号提桶分为1,2,3,4,5,6,7,8,9层),分层下划分为很多格子(五级,譬如1层下分为“1”号,“2”号,“3”号,“4”号,“5”号,“6”号,“7”号,“8”号,“9”号,“10”号,“11”号,“12”号,“13”号,“14”号,“15”号,“16”号,“17”号,“18”号,“19”号,“20”号的格子),样本最终是存放在格子中的。

样本查询部分直接上图,查询界面图的截图如下,

图片.png

图片.png

图片.png

图片.png

查询的MSSQL存储过程的代码如下:

CREATE PROCEDURE [dbo].[usp_样本_查_由复杂条件]
    -- Add the parameters for the stored procedure here
    @样本编号 varchar(12),
    @门诊号 varchar(50),
    @住院号 varchar(50),
    @姓名 varchar(20),
    @身份证号 varchar(18),
    @采血量下限 int,
    @采血量上限 int,
    @剩余量下限 int,
    @剩余量上限 int,
    @设备ID int,
    @分区ID int,
    @提桶ID int,
    @分层ID int,
    @科室ID int,
    @血型ID int,
    @采集时间选择 bit,
    @短时间格式 bit,
    @开始时间 datetime,
    @结束时间 datetime,
    @升序排列 bit,
    @样本数据类型 int,
    @开始记录索引 int,
    @结束记录索引 int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    declare @strSQL varchar(5000) -- 主语句
    declare @pageSize int

    if (@样本编号 IS NOT NULL AND LEN(@样本编号) > 0)
    begin
        set @strSQL = 'select 样本.ID,样本编号,门诊号,住院号,姓名,身份证号,血型ID,血型名称,采血量,剩余量,采集时间,添加时间,使用中,物品类别ID,物品类别名称,部门ID,部门名称,分层格子ID,格子编号,分层ID,分层编号,提桶ID,提桶编号,分区ID,分区编号,设备ID,设备编号,操作者ID,用户姓名 from 样本 join 血型 on 血型.ID=血型ID join 部门 on 部门.ID=部门ID join 用户 on 用户.ID=操作者ID join 物品类别 on 物品类别.ID=物品类别ID join 分层格子 on 分层格子.ID=分层格子ID join 提桶分层 on 提桶分层.ID=分层ID join 分区提桶 on 分区提桶.ID=提桶ID join 设备分区 on 设备分区.ID=分区ID join 设备 on 设备.ID=设备ID where 样本编号 like ''%' +@样本编号 + '%'''
    end
    else if(@门诊号 IS NOT NULL AND LEN(@门诊号) > 0)
    begin
        set @strSQL = 'select 样本.ID,样本编号,门诊号,住院号,姓名,身份证号,血型ID,血型名称,采血量,剩余量,采集时间,添加时间,使用中,物品类别ID,物品类别名称,部门ID,部门名称,分层格子ID,格子编号,分层ID,分层编号,提桶ID,提桶编号,分区ID,分区编号,设备ID,设备编号,操作者ID,用户姓名 from 样本 join 血型 on 血型.ID=血型ID join 部门 on 部门.ID=部门ID join 用户 on 用户.ID=操作者ID join 物品类别 on 物品类别.ID=物品类别ID join 分层格子 on 分层格子.ID=分层格子ID join 提桶分层 on 提桶分层.ID=分层ID join 分区提桶 on 分区提桶.ID=提桶ID join 设备分区 on 设备分区.ID=分区ID join 设备 on 设备.ID=设备ID where 门诊号 like ''%' +@门诊号 + '%'''
    end
    else if(@住院号 IS NOT NULL AND LEN(@住院号) > 0)
    begin
        set @strSQL = 'select 样本.ID,样本编号,门诊号,住院号,姓名,身份证号,血型ID,血型名称,采血量,剩余量,采集时间,添加时间,使用中,物品类别ID,物品类别名称,部门ID,部门名称,分层格子ID,格子编号,分层ID,分层编号,提桶ID,提桶编号,分区ID,分区编号,设备ID,设备编号,操作者ID,用户姓名 from 样本 join 血型 on 血型.ID=血型ID join 部门 on 部门.ID=部门ID join 用户 on 用户.ID=操作者ID join 物品类别 on 物品类别.ID=物品类别ID join 分层格子 on 分层格子.ID=分层格子ID join 提桶分层 on 提桶分层.ID=分层ID join 分区提桶 on 分区提桶.ID=提桶ID join 设备分区 on 设备分区.ID=分区ID join 设备 on 设备.ID=设备ID where 住院号 like ''%' +@住院号 + '%'''
    end
    else if(@姓名 IS NOT NULL AND LEN(@姓名) > 0)
    begin
        set @strSQL = 'select 样本.ID,样本编号,门诊号,住院号,姓名,身份证号,血型ID,血型名称,采血量,剩余量,采集时间,添加时间,使用中,物品类别ID,物品类别名称,部门ID,部门名称,分层格子ID,格子编号,分层ID,分层编号,提桶ID,提桶编号,分区ID,分区编号,设备ID,设备编号,操作者ID,用户姓名 from 样本 join 血型 on 血型.ID=血型ID join 部门 on 部门.ID=部门ID join 用户 on 用户.ID=操作者ID join 物品类别 on 物品类别.ID=物品类别ID join 分层格子 on 分层格子.ID=分层格子ID join 提桶分层 on 提桶分层.ID=分层ID join 分区提桶 on 分区提桶.ID=提桶ID join 设备分区 on 设备分区.ID=分区ID join 设备 on 设备.ID=设备ID where 姓名 like ''%' +@姓名 + '%'''
    end
    else if(@身份证号 IS NOT NULL AND LEN(@身份证号) > 0)
    begin
        set @strSQL = 'select 样本.ID,样本编号,门诊号,住院号,姓名,身份证号,血型ID,血型名称,采血量,剩余量,采集时间,添加时间,使用中,物品类别ID,物品类别名称,部门ID,部门名称,分层格子ID,格子编号,分层ID,分层编号,提桶ID,提桶编号,分区ID,分区编号,设备ID,设备编号,操作者ID,用户姓名 from 样本 join 血型 on 血型.ID=血型ID join 部门 on 部门.ID=部门ID join 用户 on 用户.ID=操作者ID join 物品类别 on 物品类别.ID=物品类别ID join 分层格子 on 分层格子.ID=分层格子ID join 提桶分层 on 提桶分层.ID=分层ID join 分区提桶 on 分区提桶.ID=提桶ID join 设备分区 on 设备分区.ID=分区ID join 设备 on 设备.ID=设备ID where 身份证号 like ''%' +@身份证号 + '%'''
    end
    else if(@采血量下限 <> -1)
    begin
        set @strSQL = 'select 样本.ID,样本编号,门诊号,住院号,姓名,身份证号,血型ID,血型名称,采血量,剩余量,采集时间,添加时间,使用中,物品类别ID,物品类别名称,部门ID,部门名称,分层格子ID,格子编号,分层ID,分层编号,提桶ID,提桶编号,分区ID,分区编号,设备ID,设备编号,操作者ID,用户姓名 from 样本 join 血型 on 血型.ID=血型ID join 部门 on 部门.ID=部门ID join 用户 on 用户.ID=操作者ID join 物品类别 on 物品类别.ID=物品类别ID join 分层格子 on 分层格子.ID=分层格子ID join 提桶分层 on 提桶分层.ID=分层ID join 分区提桶 on 分区提桶.ID=提桶ID join 设备分区 on 设备分区.ID=分区ID join 设备 on 设备.ID=设备ID where 采血量 between '+str(@采血量下限)+' and '+str(@采血量上限)
    end
    else if(@剩余量下限 <> -1)
    begin
        set @strSQL = 'select 样本.ID,样本编号,门诊号,住院号,姓名,身份证号,血型ID,血型名称,采血量,剩余量,采集时间,添加时间,使用中,物品类别ID,物品类别名称,部门ID,部门名称,分层格子ID,格子编号,分层ID,分层编号,提桶ID,提桶编号,分区ID,分区编号,设备ID,设备编号,操作者ID,用户姓名 from 样本 join 血型 on 血型.ID=血型ID join 部门 on 部门.ID=部门ID join 用户 on 用户.ID=操作者ID join 物品类别 on 物品类别.ID=物品类别ID join 分层格子 on 分层格子.ID=分层格子ID join 提桶分层 on 提桶分层.ID=分层ID join 分区提桶 on 分区提桶.ID=提桶ID join 设备分区 on 设备分区.ID=分区ID join 设备 on 设备.ID=设备ID where 剩余量 between '+str(@剩余量下限)+' and '+str(@剩余量上限)
    end
    else
    begin
        set @strSQL = 'select 样本.ID,样本编号,门诊号,住院号,姓名,身份证号,血型ID,血型名称,采血量,剩余量,采集时间,添加时间,使用中,物品类别ID,物品类别名称,部门ID,部门名称,分层格子ID,格子编号,分层ID,分层编号,提桶ID,提桶编号,分区ID,分区编号,设备ID,设备编号,操作者ID,用户姓名 from 样本 join 血型 on 血型.ID=血型ID join 部门 on 部门.ID=部门ID join 用户 on 用户.ID=操作者ID join 物品类别 on 物品类别.ID=物品类别ID join 分层格子 on 分层格子.ID=分层格子ID join 提桶分层 on 提桶分层.ID=分层ID join 分区提桶 on 分区提桶.ID=提桶ID join 设备分区 on 设备分区.ID=分区ID join 设备 on 设备.ID=设备ID'
    end
    
    if (@设备ID = -1)
    begin
        set @strSQL = 'select * from ('+ @strSQL +') as 样本1 where 1=1'
    end
    else if(@分区ID = -1)
    begin
        set @strSQL = 'select * from ('+ @strSQL +') as 样本1 where 设备ID='+CAST(@设备ID AS VARCHAR(3))
    end
    else if(@提桶ID = -1)
    begin
        set @strSQL = 'select * from ('+ @strSQL +') as 样本1 where 分区ID='+CAST(@分区ID AS VARCHAR(5))
    end
    else if(@分层ID = -1)
    begin
        set @strSQL = 'select * from ('+ @strSQL +') as 样本1 where 提桶ID='+CAST(@提桶ID AS VARCHAR(7))
    end
    else
    begin
        set @strSQL = 'select * from ('+ @strSQL +') as 样本1 where 分层ID='+CAST(@分层ID AS VARCHAR(7))
    end
    
    if (@科室ID <> -1)
    begin
        set @strSQL = @strSQL + ' and 部门ID='+CAST(@科室ID AS VARCHAR(3))
    end
    
    if (@血型ID <> -1)
    begin
        set @strSQL = @strSQL + ' and 血型ID='+CAST(@血型ID AS VARCHAR(3))
    end

    if (@采集时间选择 = 1)
    begin
        if (@短时间格式 = 1)
        begin
            set @strSQL = @strSQL + ' and 采集时间 between '''+convert(varchar(19),@开始时间,120)+''' and '''+convert(varchar(19),DATEADD(SECOND,-1,DATEADD(day,1,@结束时间)),120)+''''
        end
        else
        begin
            set @strSQL = @strSQL + ' and 采集时间 between '''+convert(varchar(19),@开始时间,120)+''' and '''+convert(varchar(19),@结束时间,120)+''''
        end
    end
    
    if (@样本数据类型 = 1)
    begin
        set @strSQL = @strSQL + ' and 使用中=1'
    end
    else if(@样本数据类型 = -1)
    begin
        set @strSQL = @strSQL + ' and 使用中=0'
    end
    
    set @strSQL = '('+ @strSQL +') as 样本2'
    
    set @pageSize=@结束记录索引-@开始记录索引;
    if @开始记录索引=0
    begin
        if @升序排列=1
        begin
            set @strSQL = 'select top '+str(@pageSize)+' * from '+@strSQL+' order by ID';
        end
        else
        begin
            set @strSQL = 'select top '+str(@pageSize)+' * from '+@strSQL+' order by ID desc';
        end
    end
    else
    begin
        if @升序排列=1
        begin
            set @strSQL = 'select top '+str(@pageSize)+' * from '+@strSQL+' where ID>(select max(ID) from (select top '+str(@开始记录索引)+' ID from '+@strSQL+' order by ID) as 样本3) order by ID';
        end
        else
        begin
            set @strSQL = 'select top '+str(@pageSize)+' * from '+@strSQL+' where ID<(select min(ID) from (select top '+str(@开始记录索引)+' ID from '+@strSQL+' order by ID desc) as 样本3) order by ID desc                                                                          ';
        end
        
    end
    
    --print @strSQL
    exec (@strSQL)
END


GO


↑ 上一篇文章:Sql Server,存储过程,函数,单引号,表示 关键词:Sql,Server的存储过程或函数中单引号的表示 发布日期:2018/8/22 16:25:19
↓ 下一篇文章:MSSQL中带事务(两种方式)的存储过程 关键词:MSSQL,事务,两种方式,两种方法,存储过程,PROC.. 发布日期:2018/8/29 10:12:51
相关文章:
使用C#编程和SQL的存储过程来处理日期时间的复合查询问题 关键词:C#,SQL,存储过程,日期时间,时间日期,DateTime,复杂查询 发布日期:2015-07-14 16:20
SQL使用中的注意事项,如单引号,Group by,order by,Top,In,join,聚合函数,索引等 关键词:SQL,注意事项,单引号,Distinct,Group,by,having,order,by,t.. 发布日期:2015-07-14 16:24
SQL SERVER 海量数据库的查询优化及分页算法 关键词:SQL,SERVER,海量数据库,查询优化,分页算法 发布日期:2015-07-14 16:03
相关目录:.NETDATABASE
我要评论
正在加载评论信息......