Sql Service存储过程分页

发表于:2015-5-12 10:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:只需要一个眼神    来源:51Testing软件测试网采编

  一起是用oracle数据库。。感觉oracle数据库强大、查询速度是杠杠的。换了家公司用的是SQL SERVICE。以前用了1年现在捡回以前的记忆。动手写了动态SQL过存储过程分页。感觉和oracle语法不太一样外。其他感觉没啥区别。。
  这个是通用存储过程。但是有一个问题我没解决就是条件怎么通用写。我条件都是拼接字符串感觉很不安全。不晓得博友门有木有什么解决方案
  不多说了直接上代码。
  GO
IF (SELECT COUNT(*) FROM sysobjects s WHERE s.[type]='P' AND s.name='SP_PAGE')>0
DROP PROC SP_PAGE
GO
CREATE PROC SP_PAGE(@tbName VARCHAR(50),@Condition NVARCHAR(1000),@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',@sumRowNumber OUT;
--计算总页数
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(@exeSql);
--事物提交还是回滚
if @@ERROR>0
BEGIN
ROLLBACK TRANSACTION;
END
ELSE
BEGIN
COMMIT TRANSACTION;
END;
END
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号