• 改良版的SQL Service 通用存储过程分页


      上次写了通用存储过程。感觉还是有很大的BUG。就是条件不能参数画化。这个BUG可以说是致命的。但是我一直想在用什么方法能解决这个东西。其实我只是想写少量的代码来做更多的事情。我想能不能传集合给存储过程但是好像这个是行不通没办法只能写死。

      上代码吧

      

    IF (SELECT COUNT(*) FROM sysobjects s WHERE s.[type]='P' AND s.name='SP_PAGE_PRACTICAL')>0
    DROP PROC SP_PAGE_PRACTICAL;
    GO
     CREATE PROC SP_PAGE_PRACTICAL(@tbName VARCHAR(50),@Condition NVARCHAR(1000),@ConditionColumn VARCHAR(100),@ConditionColumn2 VARCHAR(100),@ConditionColumn3 VARCHAR(100),@ConditionColumn4 VARCHAR(100),@ConditionColumn5 VARCHAR(100),@SortColumn VARCHAR(100), @isDesc INT,@thisPage INT,@PageRowNumber INT,@sumPage INT OUT)
     AS
     BEGIN
     	BEGIN TRANSACTION 
     	DECLARE @exeSql NVARCHAR(1000) ;
     	DECLARE @sumRowNumber INT,@descStr NVARCHAR(10);
     	SET @exeSql='select @sumRowNumber=count(*) from '+@tbName+' '+@Condition;
     	--执行动态SQL获取值
    	EXEC sp_executesql  @exeSql, N'@sumRowNumber int out,@ConditionColumn VARCHAR(100),@ConditionColumn2 VARCHAR(100),
    	@ConditionColumn3 VARCHAR(100),@ConditionColumn4 VARCHAR(100),@ConditionColumn5 VARCHAR(100)',
    	@sumRowNumber OUT,@ConditionColumn,@ConditionColumn2,@ConditionColumn3,@ConditionColumn4,@ConditionColumn5;
    	--计算总页数
    	SET @sumPage=(@sumRowNumber-1)/@PageRowNumber+1;
    	--计算分页行
    	DECLARE @BeginRow INT,@EndRow INT;
    	SET @BeginRow=(@thisPage-1)*@PageRowNumber+1;
    	SET @EndRow=@thisPage*@PageRowNumber;
    	--计算排序
    	IF @isDesc=1
    		BEGIN
    		SET @descStr='desc';
    	END
    	ELSE
    		BEGIN
    		SET	@descStr='asc';
    		END
    	SET @exeSql='select * from (select a.*,ROW_NUMBER() OVER(order by '+@SortColumn+' '+@descStr+ ') as rowIndex from '+@tbName+' a '+@Condition+') a where a.rowIndex BETWEEN '+CONVERT(VARCHAR(10),@BeginRow)+' AND '+CONVERT(VARCHAR(10),@EndRow)+'';
    	EXEC sp_executesql @exeSql,N'@ConditionColumn VARCHAR(100),
    	@ConditionColumn2 VARCHAR(100),@ConditionColumn3 VARCHAR(100),@ConditionColumn4 VARCHAR(100),
    	@ConditionColumn5 VARCHAR(100)',@ConditionColumn,@ConditionColumn2,@ConditionColumn3,@ConditionColumn4,@ConditionColumn5;
    	--事物提交还是回滚
    	if @@ERROR>0
    	BEGIN
    			ROLLBACK TRANSACTION;
    	END
    	ELSE
    		BEGIN
    					COMMIT TRANSACTION;
    		END;
     END
    

      我想我的项目里最大5个条件查询就已经OK。根据你的项目来确定有多少个条件吧 。至于参数怎么传递很简单。就需要我们发挥无线的思想了。

    DECLARE @sumPage INT;
    EXEC SP_PAGE_PRACTICAL 'tb_User_Info','where user_info_id=@ConditionColumn and (1=1 or 1=@ConditionColumn2 or 1=@ConditionColumn3 or 1=@ConditionColumn4 or 1=@ConditionColumn5)',1,1,1,1,1,'user_info_id',1,1,10,@sumPage OUT

      上面是我写的测试程序。如果有1个条件我就申明一个其他我全部1=1。完全不和其他条件冲突。

      如果哪位大神有更好的方法和更好的思路可以解决问题。我们可以一起探讨和研究哦

      

      

  • 相关阅读:
    希尔排序
    基数排序
    spring8——AOP之Bean的自动代理生成器
    spring7——AOP之通知和顾问
    spring6——AOP的编程术语
    spring5——Aop的实现原理(动态代理)
    spring4——IOC之基于注解的依赖注入(DI )
    spring3——IOC之基于XML的依赖注入(DI )
    spring2——IOC之Bean的装配
    spring1——IOC之原理
  • 原文地址:https://www.cnblogs.com/changeMe/p/4503633.html
Copyright © 2020-2023  润新知