betway必威-betway必威官方网站
做最好的网站

分页存储过程,存储过程嵌套示例

大旨提醒:事例数据库表:公司音讯表表名称prd_wxt_enterprise_tbl_EnterpriseInfo数据来源 存款和储蓄数据公司音信表主键/外键 字段名称表明项目

正文转自:

背景:

1卡塔尔(قطر‎事例数据库表: 集团信息表 表名称 prd_wxt_enterprise_tbl_EnterpriseInfo 数据来源 存款和储蓄数据 集团新闻表 主键/外键 字段名称 表明 类型 备注 cEnterpriseId n集团ID Char(10卡塔尔(قطر‎sEnterpriseName n公司名称 Varchar(200卡塔尔(قطر‎ sShortName n简单的称呼 Varchar(50)sAddress n地址 nVarchar(200State of Qatar E_system n集团所属系统 Char(1State of Qatar

版权注解:作者:jiankunking 出处:  本文版权归我和CSDN共有,迎接转发,但未经小编同意必须保留此段申明,且在篇章页面分明地点给出原来的文章连接。

蒙受这么一种景况:动态向存储进程中传出表名和表的有个别质量(这里运用的是主键ID),然后利用那四个变量查出一条数据的一点字段值,然后再使用这么些值实行逻辑运算(本人的逻辑),最终将结果输出。话非常的少说,直接上海体育场合,看是不是是你想要的结果:

产品表 表名称 Shop_tbl_ProductInfo 数据来源 存款和储蓄数据 产物表 主键/外键 字段名称 表明 类型 备注 P_Code(PKState of Qatarn付加物SKU号,即下单号,付加物种类编号(p123456789卡塔尔 Char(10卡塔尔国 not null EnterpriseId n集团ID Char(10卡塔尔 not null P_Name n付加物名称 Nvarchar(100卡塔尔国not null P_Price n成品价格 Money P_UserPrice n成品会员价 Money Remark n备注 Nvarchar(500卡塔尔国 2卡塔尔(قطر‎要落到实处的职能: 删除旧集团数目及有关的制品,必要用嵌套存款和储蓄过程达成 3卡塔尔国存款和储蓄进程:包涵多个存款和储蓄进度 a卡塔尔存储进程一:依照公司ID,删除该铺面及上边包车型大巴制品: 存款和储蓄进程代码如下: /* 成效:删除集团,同期删除关联的表,富含集团表及其涉及的出品表数据 创设人: 创制日期:2006-4-10 改进日期:二〇〇五-4-10 */ CREATE PROCEDURE [DeleteEnterprise] ( @EnterpriseID nvarchar(10卡塔尔 卡塔尔国 AS declare @strSQL nvarchar(4000卡塔尔 --删除集团付加物表 select @strSQL = delete from Shop_tbl_ProductInfo where EnterpriseId= @EnterpriseID ; exec(@strSQLState of Qatar--删除公司表 select @strSQL = delete from prd_wxt_enterprise_tbl_EnterpriseInfo where cEnterpriseID= @EnterpriseID ; exec(@strSQL) GO

分页存款和储蓄进程一:

图片 1 

bState of Qatar存款和储蓄进度二:选出旧企业的数额,然后经过巡回嵌套的办法,通过循环语句调用存款和储蓄进程一,删除全体的旧公司数量及其产物数据 存款和储蓄进度代码如下: /* 作用:删除旧公司数据,同期删除关联的表,包涵创设人: 创立日期:贰零零陆-4-11 修正日期:二〇〇七-4-11 */ CREATE PROCEDURE [DeleteOldEnterprise] AS declare @strSQL nvarchar(4000) declare @EnterpriseID nvarchar(10) DECLARE Enterprise_CURSOR Cursor FOR Select cEnterpriseId from prd_wxt_enterprise_tbl_EnterpriseInfo where e_system=1 or e_system is null OPEN Enterprise_CURSOR Fetch next from Enterprise_CUOdysseySO景逸SUV into @EnterpriseID --以下一向到END都以循环语句 WHILE @@FETCH_STATUS = 0 BEGIN --上边那行是调用存储过程一删除集团及其产品数量 exec DeleteEnterprise @EnterpriseID Fetch next from Enterprise_CURSOR into @EnterpriseID END CLOSE Enterprise_CURSOR DEALLOCATE Enterprise_CURSOR GO

 

图片 2

[sql] view plain copy print?

证实:【区域1为要用来测验的表】【  区域2 为表中数据】【区域3 为表中数量jan feb mar列值的和5】

  1. --/*-----存款和储蓄进程 分页管理 孙伟 2007-03-28创办 -------*/   
  2. --/*----- 对数码进行了2分管理使查询前半某个数目与查询后半有的数码质量相近 -------*/   
  3. --/*-----存款和储蓄进度 分页管理 孙伟 2007-04-21修改 增加Distinct查询成效-------*/   
  4. --/*-----存款和储蓄进程 分页管理 孙伟 二〇〇五-05-18校订 多字段排序准绳难题-------*/   
  5. --/*-----存款和储蓄进程 分页管理 孙伟 2006-06-15改革 多字段排序改进-------*/   
  6. --/*-----存款和储蓄进度 分页管理 孙伟 2005-12-13改正 改善数据分页形式为top max格局质量有庞大提升-------*/   
  7. --/*-----劣点:相对此前的not in版本主键只好是整型字段,如主键为GUID类型请使用not in 形式的版本-------*/   
  8. CREATE PROCEDURE dbo.proc_ListPageInt   
  9. (   
  10. @tblName nvarchar(200卡塔尔, ----要体现的表或七个表的接连几日   
  11. @fldName nvarchar(500) = '*', ----要显得的字段列表   
  12. @pageSize int = 10, ----每页显示的笔录个数   
  13. @page int = 1, ----要显得那一页的记录   
  14. @pageCount int = 1 output, ----查询结果分页后的总页数   
  15. @Counts int = 1 output, ----查询到的记录数   
  16. @fldSort nvarchar(200卡塔尔(قطر‎ = null, ----排序字段列表或标准   
  17. @Sort bit = 0, ----排序方法,0为升序,1为降序(假若是多字段排列Sort指代最终贰个排序字段的排列顺序(最终一个排序字段不加排序标识卡塔尔(قطر‎--程序传参如:' SortA Asc,SortB Desc,SortC '卡塔尔   
  18. @strCondition nvarchar(1000State of Qatar = null, ----查询条件,不需where   
  19. @ID nvarchar(150State of Qatar, ----主表的主键   
  20. @Dist bit = 0 ----是或不是充足查询字段的 DISTINCT 暗许0不足够/1增多   
  21. )   
  22. AS   
  23. SET NOCOUNT ON   
  24. Declare @sqlTmp nvarchar(1000卡塔尔国 ----贮存动态变化的SQL语句   
  25. Declare @strTmp nvarchar(1000卡塔尔国 ----贮存获得查询结果总的数量的查询语句   
  26. Declare @strID nvarchar(1000State of Qatar ----贮存获得查询开头或最后ID的查询语句   
  27.   
  28. Declare @strSortType nvarchar(10卡塔尔 ----数据排序法则A   
  29. Declare @strFSortType nvarchar(10State of Qatar ----数据排序法则B   
  30.   
  31. Declare @SqlSelect nvarchar(50卡塔尔国 ----对含有DISTINCT的查询实行SQL布局   
  32. Declare @SqlCounts nvarchar(50卡塔尔国 ----对含蓄DISTINCT的总和查询实行SQL布局   
  33.   
  34.   
  35. if @Dist = 0   
  36. begin   
  37. set @SqlSelect = 'select '   
  38. set @SqlCounts = 'Count(*)'   
  39. end   
  40. else   
  41. begin   
  42. set @SqlSelect = 'select distinct '   
  43. set @SqlCounts = 'Count(DISTINCT ' @ID ')'   
  44. end   
  45.   
  46.   
  47. if @Sort=0   
  48. begin   
  49. set @strFSortType=' ASC '   
  50. set @strSortType=' DESC '   
  51. end   
  52. else   
  53. begin   
  54. set @strFSortType=' DESC '   
  55. set @strSortType=' ASC '   
  56. end   
  57.   
  58.   
  59.   
  60. --------生成查询语句--------   
  61. --此处@strTmp为获得查询结果数量的语句   
  62. if @strCondition is null or @strCondition='' --未有安装显示标准   
  63. begin   
  64. set @sqlTmp = @fldName   ' From '   @tblName   
  65. set @strTmp = @SqlSelect ' @Counts=' @SqlCounts ' FROM ' @tblName  
  66. set @strID = ' From '   @tblName   
  67. end   
  68. else   
  69. begin   
  70. set @sqlTmp =   @fldName   'From '   @tblName   ' where (1>0) '   @strCondition   
  71. set @strTmp = @SqlSelect ' @Counts=' @SqlCounts ' FROM ' @tblName   ' where (1>0) '   @strCondition   
  72. set @strID = ' From '   @tblName   ' where (1>0) '   @strCondition   
  73. end   
  74.   
  75. ----获得查询结果总的数量据-----   
  76. exec sp_executesql @strTmp,N'@Counts int out ',@Counts out   
  77. declare @tmpCounts int   
  78. if @Counts = 0   
  79. set @tmpCounts = 1   
  80. else   
  81. set @tmpCounts = @Counts   
  82.   
  83. --获得分页总量   
  84. set @pageCount=(@tmpCounts @pageSize-1)/@pageSize   
  85.   
  86. /**//**当前页大于总页数 取最终一页**/   
  87. if @page>@pageCount   
  88. set @page=@pageCount   
  89.   
  90. --/*-----数据分页2分处理-------*/   
  91. declare @pageIndex int --总数/页大小   
  92. declare @lastcount int --总数%页大小   
  93.   
  94. set @pageIndex = @tmpCounts/@pageSize   
  95. set @lastcount = @tmpCounts%@pageSize   
  96. if @lastcount > 0   
  97. set @pageIndex = @pageIndex   1   
  98. else   
  99. set @lastcount = @pagesize   
  100.   
  101. --//***来得分页   
  102. if @strCondition is null or @strCondition='' --未有安装展现规范   
  103. begin   
  104. if @pageIndex<2 or @page<=@pageIndex / 2   @pageIndex % 2 --前半有的多少管理   
  105. begin   
  106. if @page=1   
  107. set @strTmp=@SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName  
  108. ' order by '  @fldSort  ' '  @strFSortType   
  109. else   
  110. begin   
  111. set @strTmp=@SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName  
  112. ' where ' @ID ' <(select min('  @ID  ') from ('  @SqlSelect ' top '  CAST(@pageSize*(@page-1) as Varchar(20))  ' '  @ID  ' from ' @tblName  
  113. ' order by '  @fldSort  ' '  @strFSortType ') AS TBMinID)'   
  114. ' order by '  @fldSort  ' '  @strFSortType   
  115. end   
  116. end   
  117. else   
  118. begin   
  119. set @page = @pageIndex-@page 1 --后半部分数目管理   
  120. if @page <= 1 --最终一页数据展现   
  121. set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top '  CAST(@lastcount as VARCHAR(4)) ' '  @fldName ' from ' @tblName  
  122. ' order by '  @fldSort  ' '  @strSortType ') AS TempTB' ' order by '  @fldSort  ' '  @strFSortType   
  123. else   
  124. set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName  
  125. ' where ' @ID ' >(select max('  @ID  ') from('  @SqlSelect ' top '  CAST(@pageSize*(@page-2) @lastcount as Varchar(20))  ' '  @ID  ' from ' @tblName  
  126. ' order by '  @fldSort  ' '  @strSortType ') AS TBMaxID)'   
  127. ' order by '  @fldSort  ' '  @strSortType ') AS TempTB' ' order by '  @fldSort  ' '  @strFSortType   
  128. end   
  129. end   
  130.   
  131. else --有查询条件   
  132. begin   
  133. if @pageIndex<2 or @page<=@pageIndex / 2   @pageIndex % 2 --前半局部数额管理   
  134. begin   
  135. if @page=1   
  136. set @strTmp=@SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName  
  137. ' where 1=1 '   @strCondition   ' order by '  @fldSort  ' '  @strFSortType   
  138. else   
  139. begin   
  140. set @strTmp=@SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName  
  141. ' where ' @ID ' <(select min('  @ID  ') from ('  @SqlSelect ' top '  CAST(@pageSize*(@page-1) as Varchar(20))  ' '  @ID  ' from ' @tblName  
  142. ' where (1=1) '   @strCondition  ' order by '  @fldSort  ' '  @strFSortType ') AS TBMinID)'   
  143. ' '  @strCondition  ' order by '  @fldSort  ' '  @strFSortType   
  144. end   
  145. end   
  146. else   
  147. begin   
  148. set @page = @pageIndex-@page 1 --后半某个数量管理   
  149. if @page <= 1 --最终一页数据突显   
  150. set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top '  CAST(@lastcount as VARCHAR(4)) ' '  @fldName ' from ' @tblName  
  151. ' where (1=1) '  @strCondition  ' order by '  @fldSort  ' '  @strSortType ') AS TempTB' ' order by '  @fldSort  ' '  @strFSortType   
  152. else   
  153. set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName  
  154. ' where ' @ID ' >(select max('  @ID  ') from('  @SqlSelect ' top '  CAST(@pageSize*(@page-2) @lastcount as Varchar(20))  ' '  @ID  ' from ' @tblName  
  155. ' where (1=1) '  @strCondition  ' order by '  @fldSort  ' '  @strSortType ') AS TBMaxID)'   
  156. ' '  @strCondition ' order by '  @fldSort  ' '  @strSortType ') AS TempTB' ' order by '  @fldSort  ' '  @strFSortType   
  157. end   
  158. end   
  159.   
  160. ------再次回到查询结果-----   
  161. exec sp_executesql @strTmp   
  162. --print @strTmp   
  163. SET NOCOUNT OFF   
  164. GO   

    --/-----存款和储蓄进程 分页处理 孙伟 2005-03-28创造 -------/ --/----- 对数码进行了2分处理使查询前半片段数目与查询后半片段数码质量雷同 -------/ --/-----存款和储蓄进度 分页管理 孙伟 二〇〇七-04-21改造 增多Distinct查询成效-------/ --/-----存储进程 分页管理 孙伟 二〇〇七-05-18改换 多字段排序法则难题-------/ --/-----存款和储蓄进程 分页处理 孙伟 二〇〇五-06-15改革 多字段排序改正-------/ --/-----存款和储蓄进程 分页管理 孙伟 二零零六-12-13改变 修正数据分页格局为top max形式性能有宏大提升-------/ --/-----瑕玷:相对在此之前的not in版本主键只好是整型字段,如主键为GUID类型请使用not in 形式的版本-------/ CREATE PROCEDURE dbo.proc_ListPageInt ( @tblName nvarchar(200卡塔尔国, ----要显得的表或多少个表的三番五次 @fldName nvarchar(500卡塔尔国 = '*', ----要来得的字段列表 @pageSize int = 10, ----每页展现的记录个数 @page int = 1, ----要呈现那一页的笔录 @pageCount int = 1 output, ----查询结果分页后的总页数 @Counts int = 1 output, ----查询到的记录数 @fldSort nvarchar(200卡塔尔(قطر‎ = null, ----排序字段列表或条件 @Sort bit = 0, ----排序方法,0为升序,1为降序(如若是多字段排列Sort指代最后叁个排序字段的排列顺序(最终叁个排序字段不加排序标识State of Qatar--程序传参如:' SortA Asc,SortB Desc,SortC '卡塔尔(قطر‎ @strCondition nvarchar(1000卡塔尔国 = null, ----查询条件,不需where @ID nvarchar(150卡塔尔国, ----主表的主键 @Dist bit = 0 ----是不是丰裕查询字段的 DISTINCT 私下认可0不增添/1增加 State of Qatar AS SET NOCOUNT ON Declare @sqlTmp nvarchar(1000State of Qatar ----寄存动态变化的SQL语句 Declare @strTmp nvarchar(1000卡塔尔国 ----寄存取得查询结果总量的查询语句 Declare @strID nvarchar(1000卡塔尔国 ----寄放获得查询开端或最终ID的询问语句

    Declare @strSortType nvarchar(10卡塔尔(قطر‎ ----数据排序法则A Declare @strFSortType nvarchar(10State of Qatar ----数据排序法规B

    Declare @SqlSelect nvarchar(50卡塔尔 ----对包罗DISTINCT的查询进行SQL结构 Declare @SqlCounts nvarchar(50卡塔尔国 ----对含有DISTINCT的总和查询实行SQL结构

存款和储蓄进程代码如下:

if @Dist = 0 
begin 
set @SqlSelect = 'select ' 
set @SqlCounts = 'Count(*)' 
end 
else 
begin 
set @SqlSelect = 'select distinct ' 
set @SqlCounts = 'Count(DISTINCT ' @ID ')' 
end 


if @Sort=0 
begin 
set @strFSortType=' ASC ' 
set @strSortType=' DESC ' 
end 
else 
begin 
set @strFSortType=' DESC ' 
set @strSortType=' ASC ' 
end 



--------生成查询语句-------- 
--此处@strTmp为取得查询结果数量的语句 
if @strCondition is null or @strCondition='' --没有设置显示条件 
begin 
set @sqlTmp = @fldName   ' From '   @tblName 
set @strTmp = @SqlSelect ' @Counts=' @SqlCounts ' FROM ' @tblName
set @strID = ' From '   @tblName 
end 
else 
begin 
set @sqlTmp =   @fldName   'From '   @tblName   ' where (1>0) '   @strCondition 
set @strTmp = @SqlSelect ' @Counts=' @SqlCounts ' FROM ' @tblName   ' where (1>0) '   @strCondition 
set @strID = ' From '   @tblName   ' where (1>0) '   @strCondition 
end 

----取得查询结果总数量----- 
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out 
declare @tmpCounts int 
if @Counts = 0 
set @tmpCounts = 1 
else 
set @tmpCounts = @Counts 

--取得分页总数 
set @pageCount=(@tmpCounts @pageSize-1)/@pageSize 

/**//**当前页大于总页数 取最后一页**/ 
if @page>@pageCount 
set @page=@pageCount 

--/*-----数据分页2分处理-------*/ 
declare @pageIndex int --总数/页大小 
declare @lastcount int --总数%页大小 

set @pageIndex = @tmpCounts/@pageSize 
set @lastcount = @tmpCounts%@pageSize 
if @lastcount > 0 
set @pageIndex = @pageIndex   1 
else 
set @lastcount = @pagesize 

--//***显示分页 
if @strCondition is null or @strCondition='' --没有设置显示条件 
begin 
if @pageIndex<2 or @page<=@pageIndex / 2   @pageIndex % 2 --前半部分数据处理 
begin 
if @page=1 
set @strTmp=@SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName
 ' order by '  @fldSort  ' '  @strFSortType 
else 
begin 
set @strTmp=@SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName
 ' where ' @ID ' <(select min('  @ID  ') from ('  @SqlSelect ' top '  CAST(@pageSize*(@page-1) as Varchar(20))  ' '  @ID  ' from ' @tblName
 ' order by '  @fldSort  ' '  @strFSortType ') AS TBMinID)' 
 ' order by '  @fldSort  ' '  @strFSortType 
end 
end 
else 
begin 
set @page = @pageIndex-@page 1 --后半部分数据处理 
if @page <= 1 --最后一页数据显示 
set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top '  CAST(@lastcount as VARCHAR(4)) ' '  @fldName ' from ' @tblName
 ' order by '  @fldSort  ' '  @strSortType ') AS TempTB' ' order by '  @fldSort  ' '  @strFSortType 
else 
set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName
 ' where ' @ID ' >(select max('  @ID  ') from('  @SqlSelect ' top '  CAST(@pageSize*(@page-2) @lastcount as Varchar(20))  ' '  @ID  ' from ' @tblName
 ' order by '  @fldSort  ' '  @strSortType ') AS TBMaxID)' 
 ' order by '  @fldSort  ' '  @strSortType ') AS TempTB' ' order by '  @fldSort  ' '  @strFSortType 
end 
end 

else --有查询条件 
begin 
if @pageIndex<2 or @page<=@pageIndex / 2   @pageIndex % 2 --前半部分数据处理 
begin 
if @page=1 
set @strTmp=@SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName
 ' where 1=1 '   @strCondition   ' order by '  @fldSort  ' '  @strFSortType 
else 
begin 
set @strTmp=@SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName
 ' where ' @ID ' <(select min('  @ID  ') from ('  @SqlSelect ' top '  CAST(@pageSize*(@page-1) as Varchar(20))  ' '  @ID  ' from ' @tblName
 ' where (1=1) '   @strCondition  ' order by '  @fldSort  ' '  @strFSortType ') AS TBMinID)' 
 ' '  @strCondition  ' order by '  @fldSort  ' '  @strFSortType 
end 
end 
else 
begin 
set @page = @pageIndex-@page 1 --后半部分数据处理 
if @page <= 1 --最后一页数据显示 
set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top '  CAST(@lastcount as VARCHAR(4)) ' '  @fldName ' from ' @tblName
 ' where (1=1) '  @strCondition  ' order by '  @fldSort  ' '  @strSortType ') AS TempTB' ' order by '  @fldSort  ' '  @strFSortType 
else 
set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top '  CAST(@pageSize as VARCHAR(4)) ' '  @fldName ' from ' @tblName
 ' where ' @ID ' >(select max('  @ID  ') from('  @SqlSelect ' top '  CAST(@pageSize*(@page-2) @lastcount as Varchar(20))  ' '  @ID  ' from ' @tblName
 ' where (1=1) '  @strCondition  ' order by '  @fldSort  ' '  @strSortType ') AS TBMaxID)' 
 ' '  @strCondition ' order by '  @fldSort  ' '  @strSortType ') AS TempTB' ' order by '  @fldSort  ' '  @strFSortType 
end 
end 

------返回查询结果----- 
exec sp_executesql @strTmp 
--print @strTmp 
SET NOCOUNT OFF 
GO 

图片 3

怎么在数据库中测量试验呢?

图片 4

 

从上海教室能够看出既然能够获得jan 、feb、mar列的值,后边再做要好的剖断就便于了。不再赘述。

 

出于学艺不精,上述结论是受外人的误导才得出的,相关链接:

[sql] view plain copy print?

下边贴出原来的小说者博文原来的书文(身为一名技师,你懂的):

  1. declare @pageCount int   
  2. declare @Counts int   
  3. exec [dbo].[proc_ListPageInt] 'sysobjects', '* ', 20,1,@pageCount output,@Counts output,'id', 0,'','id',0  
  4. print @pageCount --那几个不以为意   
  5. print @Counts --那么些无关紧要   

    declare @pageCount int declare @Counts int exec [dbo].[proc_ListPageInt] 'sysobjects', '* ', 20,1,@pageCount output,@Counts output,'id', 0,'','id',0 print @pageCount --这一个无关大局 print @Counts --那几个无足轻重

sp_executesql介绍和选择

本文由betway必威发布于编程开发,转载请注明出处:分页存储过程,存储过程嵌套示例

TAG标签: betway必威
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。