惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
罗磊的独立博客
V
Visual Studio Blog
爱范儿
爱范儿
H
Help Net Security
J
Java Code Geeks
I
InfoQ
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recorded Future
Recorded Future
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
S
SegmentFault 最新的问题
S
Securelist
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
博客园_首页
B
Blog
F
Fortinet All Blogs
AWS News Blog
AWS News Blog
V
Vulnerabilities – Threatpost
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Schneier on Security
Project Zero
Project Zero
Martin Fowler
Martin Fowler
C
Cybersecurity and Infrastructure Security Agency CISA
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic

博客园 - 阿栋.c#

Ubuntu 12.10 安装 JDK 7u15官方版 sql2005新特性 for xml , outer apply ,多行转成单列方法 完美解决Android系统短信发送每小时限制100条问题 PAZU -- 4Fang WEB 打印控件 正则表达式删除指定的HTML 标签 - 阿栋.c# - 博客园 数据库备份还原到指定时间 人事管理系统的一般功能需求 ASP.NET木马及Webshell安全解决方案 在 64 位版本的 Windows 上,如何在 32 位版本的 ASP.NET 1.1 和 64 位版本的 ASP.NET 2.0 之间切换 win2003,IIS6.0 不能上传大于200K文件的解决办法 JavaScript:全面解析Ajax跨站数据传输和iframe跨域名js调用 SQL2000 排名 注册表 SAM - 阿栋.c# - 博客园 jquery radio,checkbox,select操作 - 阿栋.c# - 博客园 参数化查询 ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET) eWebeditor集成aspjpeg 删除master库中不安全的扩展存储过程 ASP在使用SQL SERVER存储过程中的问题
转---支持非主键排序的SQL存储过程
阿栋.c# · 2009-05-22 · via 博客园 - 阿栋.c#

CREATE PROCEDURE pagination
    @tbName      nvarchar(255) , -- 表名(允许多张表的join)
    @keyorder      nvarchar(255) , -- 用于排序的字段名 后面可以追加' asc' 或' desc', 不支持对多个字段排序
    @keymain      nvarchar(255), -- 主键字段名(如果用于排序的字段的值是唯一的,应将此参数设为''或null(不这样将会降低效率); 如果用于排序的字段的值不是唯一的, 则需要写真实的主键) 后面可以追加' asc' 或' desc', 不支持多个主键
    @columns nvarchar(1000)='*', -- 要选择的列 (注意: 本存储过程不会自动给列名或表名加方括号)
    @strWhere     nvarchar(3000) = '',  -- 查询条件 (注意: 不要加 where)
    @PageSize     int = 10, -- 页尺寸
    @PageIndex    int = 1 output, -- 页码
    @RowsCount    int=0 output, -- 记录总数,
    @PageCount int=0 output --页面总数
AS
begin

declare @s1 nvarchar(100) -- 临时变量
declare @s2 nvarchar(100) -- 临时变量

declare @strSQL   nvarchar(4000) -- 主语句
declare @strTmp   nvarchar(3000) -- 临时变量
declare @strOrder nvarchar(2000) -- 排序类型

--取得总行数
if @strWhere != ''
 set @strSQL='SELECT @RowsCount=count(*) FROM '+@tbName+' where ' + @strWhere
else
 set @strSQL='SELECT @RowsCount=count(*) FROM '+@tbName
exec sp_executesql @strSQL, N'@RowsCount int out', @RowsCount out
set @strSQL=''

--计算总页数  
set @PageCount=@RowsCount/@PageSize
if (@RowsCount % @PageSize<>0)
 set @PageCount=@PageCount+1
if (@PageCount<1)
 set @PageCount=1

--错误处理
if (@PageSize<1)
 set @PageSize=1
if (@PageIndex<1)
 set @PageIndex=1
if (@PageIndex>@PageCount)
 set @PageIndex=@PageCount

--拼接Order By子句
declare @strOrderType1 nvarchar(50)
declare @strOrderType2 nvarchar(50)
if(CHARINDEX(' desc', @keyorder)>0)
 begin
 set @strOrderType1='desc'
 set @keyorder=REPLACE(@keyorder, ' desc', '')
 end
else
 begin
 set @strOrderType1='asc'
 set @keyorder=REPLACE(@keyorder, ' asc', '')
 end

----求字段类型start
declare @OrderTable nvarchar(255)
declare @OrderName nvarchar(255)
declare @OrderType varchar(255)
declare @OrderPrec varchar(50)
declare @OrderDot int
set @OrderDot=CHARINDEX('.', @keyorder)
IF @OrderDot > 0
 BEGIN
 SET @OrderTable = SUBSTRING(@keyorder, 0, @OrderDot)
 SET @OrderName = SUBSTRING(@keyorder, @OrderDot + 1, LEN(@keyorder))
 END
ELSE
 BEGIN
 SET @OrderTable = @tbName
 SET @OrderName = @keyorder
 END
set @s1=REPLACE(REPLACE (@OrderTable,'[',''),']','')
set @s2=REPLACE(REPLACE (@OrderName,'[',''),']','')
SELECT @OrderType=t.[name], @OrderPrec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @s1 AND c.[name] = @s2
IF CHARINDEX('char', @OrderType) > 0
 SET @OrderType = @OrderType + '(' + CAST(@OrderPrec AS varchar) + ')'
----求字段类型end

if @strOrderType1='asc'
 begin
 set @strOrderType1 = '>'
 set @strOrder = ' order by ' + @keyorder +' asc'
 end
else
 begin
 set @strOrderType1 = '<'
 set @strOrder = ' order by ' + @keyorder +' desc'
 end
if @keymain is null
 set @keymain=''
if @keymain<>''
 begin
 if(CHARINDEX(' desc', @keymain)>0)
  begin
  set @strOrderType2='desc'
  set @keymain=REPLACE(@keymain, ' desc', '')
  end
 else
  begin
  set @strOrderType2='asc'
  set @keymain=REPLACE(@keymain, ' asc', '')
  end
 
 ----求字段类型start
 declare @MainTable nvarchar(255)
 declare @MainName nvarchar(255)
 declare @MainType varchar(255)
 declare @MainPrec varchar(50)
 declare @MainDot int
 set @MainDot=CHARINDEX('.', @keymain)
 IF @MainDot > 0
  BEGIN
  SET @MainTable = SUBSTRING(@keymain, 0, @MainDot)
  SET @MainName = SUBSTRING(@keymain, @MainDot + 1, LEN(@keymain))
  END
 ELSE
  BEGIN
  SET @MainTable = @tbName
  SET @MainName = @keymain
  END
 set @s1=REPLACE(REPLACE (@MainTable,'[',''),']','')
 set @s2=REPLACE(REPLACE (@MainName,'[',''),']','')
 SELECT @MainType=t.name, @MainPrec=c.prec
 FROM sysobjects o
 JOIN syscolumns c on o.id=c.id
 JOIN systypes t on c.xusertype=t.xusertype
 WHERE o.name = @s1 AND c.name = @s2

 IF CHARINDEX('char', @MainType) > 0
 SET @MainType = @MainType + '(' + CAST(@MainPrec AS varchar) + ')'
 ----求字段类型end
 
  if @strOrderType2='asc'
  begin
  set @strOrderType2='>'
  set @strOrder =@strOrder + ', ' + @keymain +' asc'
  end
  else
  begin
  set @strOrderType2='<'
  set @strOrder =@strOrder + ', ' + @keymain +' desc'
  end
 end

--拼接查询语句
if @PageIndex = 1
 begin
  set @strTmp =''
  if @strWhere != ''
  set @strTmp = ' where ' + @strWhere
  set @strSQL = 'select top ' + convert(nvarchar(100),@PageSize) + ' '+@columns+' from '   + @tbName + ' ' + @strTmp + ' ' + @strOrder
 end
else
 begin
  --求临界值
  set @strSQL='declare @midData '+@OrderType+';'
  if @MainType is not null
  set @strSQL=@strSQL+'declare @midID '+@MainType+';'
  set @strSQL=@strSQL+'SET ROWCOUNT '+ convert(nvarchar(100),(@PageIndex-1)*@PageSize)+';'        
  if  @keymain<>''
  set @strSQL =@strSQL+ 'select @midData= '    + @keyorder + ', @midID=' + @keymain + ' from ' + @tbName
  else
  set @strSQL =@strSQL+ 'select @midData= '    + @keyorder + ' from ' + @tbName
  if @strWhere != ''
  set @strSQL=@strSQL+ ' where ' + @strWhere
  set @strSQL=@strSQL+' '+@strOrder+';'
  --print (@strSQL); return
  --最终查询语句
  set @strSQL=@strSQL+'SET ROWCOUNT '+ convert(nvarchar(100),@PageSize) +';'        
  if  @keymain<>''
  set @strSQL =@strSQL+ 'select '+@columns+' from '    + @tbName + ' where (' + @keyorder + @strOrderType1 + '@midData or ('    + @keyorder + '=@midData and ' + @keymain + @strOrderType2 +'@midID))'
  else
  set @strSQL =@strSQL+ 'select '+@columns+' from '    + @tbName + ' where ' + @keyorder + @strOrderType1 + '@midData'
  if @strWhere <> ''
  set @strSQL=@strSQL+' and '+ @strWhere
  set @strSQL=@strSQL+' ' + @strOrder
 end

--执行查询语句
--print (@strSQL); return
exec (@strSQL)

end
GO