row_number over(order by id desc)语句进行存储过程高效分页,百度分页(1,2,3,4,5....)

模仿百度分页示意效果图:

sql procdure code:

create   proc [dbo].[MyPages](
 @tableName varchar(155),
 @pageIndex int,
 @pageSize int,
 @pageCurrent int output,
 @pageNumber int output,  --总页数
 @pageCount int output, --总记录
 @clickType varchar(15)=null,--点击按钮的类型
 @keyId varchar(15),
 @columnName varchar(255),
 @strWhere varchar(1000)
)
as
declare @totalCount int
declare @strCount nvarchar(155)
declare @strSql  nvarchar(1000)

set nocount on
set @strCount='SELECT @totalCount=COUNT(*) FROM '+ @tableName+' WHERE '+@strWhere
exec sp_executeSql @strCount,N'@totalCount int out',@totalCount=@pageCount out
 if(@pageCount%@pageSize=0)
  set @pageNumber=(@pageCount/@pageSize)
 else
  begin
  set @pageNumber=(@pageCount/@pageSize)+1
  end
--if(@strWhere='')begin set @strWhere='1=1' end
if(@clickType!='')begin
  if(@clickType='pre')begin
    set @pageIndex=(@pageIndex-1)
  end
  else if(@clickType='next')begin
    set @pageIndex=(@pageIndex+1)
  end
end
set @pageCurrent=@pageIndex
set @strSql='SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@keyId+' DESC) AS Row,'+@columnName+' FROM '+@tableName+' WHERE '+ @strWhere+' ) TT WHERE TT.Row BETWEEN '+str((@pageIndex-1)*@pageSize+1)+' AND '+str(@pageIndex*@pageSize)
exec (@strSql)
set nocount off

 

 

在设计这段存储过程的时候,让我深刻了解了两个知识点:

一:在声明变量的时候,一定要注意变量的类型

下面讲下声明变量类型时的错误:

   1.sql存储过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'错误时,就要注意在declare xx声明变量的时候,它的类型(nvarchar(size))一定要定义正确。

   比如:

create procedure testProce(
  @tableName varchar(25),
  @count int output
)AS
declare @strSql varchar(255) -----改为declare @sttSql Nvarchar(255)就对了
declare @totalCount int

set @strSql='SELECT @totalCount=COUNT(*) FROM '+@tableName
execute (@strSql)

set @count=@totalCount

 

//调用存储过程

declare @count int
execute testProce N'BG_Bargain',@count out

消息 214,级别 16,状态 2,过程 sp_executesql,第 1 行
过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'

一定要切记:declare @strSql  Nvarchar(255) 要加一个N

 

二:execute命令和execute sp_executeSql的区别

2.在很久以前对于存储过程一直比较的陌生,今天要用到动态拼接sql语句,并且要输入、输出参数,远远用execute是很难做到的,这让我了解到sp_executeSql的用法

  简单的讲下execute @sql 和execute sp_executeSq @Sqll的区别:

execute描述: 

   a.execute不提供接口这里的接口是指,它不能执行一个包含一个带变量符的批处理,如果执行带变量符的批处理,就会出现    必须声明标量变量 "@变量"等错误信息。

   b.execute除了不支持动态批处理中的输入参数外,他也不支持输出参数
execute sp_executeSql描述:
  

sp_executesql提供接口

sp_executesql命令比execute命令更灵活,因为它提供一个接口,该接口及支持输入参数也支持输出参数。这功能使你可以创建带参数的查询字符串,这样就可以比EXEC更好的重用执行计划,sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。它的构成包括:代码快,参数声明部分,参数赋值部分。说了这么多,还是看看它的语法吧

execute sp_executesql

@stmt = <statement>,--类似存储过程主体

@params = <params>, --类似存储过程参数部分

<params assignment> --类似存储过程调用

@stmt参数是输入的动态批处理,它可以引入输入参数或输出参数,和存储过程的主体语句一样,只不过它是动态的,而存储过程是静态的,不过你也可以在存储过程中使用sp_executesql;

@params参数与定义输入/输出参数的存储过程头类似,实际上和存储过程头的语法完全一样;

@<params assignment> 与调用存储过程的EXEC部分类似。

从其中可以体会到,sp_executeSql命令比execute命令更加强大,更加灵活,可编译性更强。

 

三:采用C#调用sql中存储过程(得到输出参数的value)

SqlParameter[] param ={
                new SqlParameter("@tableName",SqlDbType.VarChar,15),
                new SqlParameter("@pageIndex",SqlDbType.Int,4),
                new SqlParameter("@pageSize",SqlDbType.Int,4),
                new SqlParameter("@pageCurrent",SqlDbType.Int,4),
                new SqlParameter("@pageNumber",SqlDbType.Int,4),
                new SqlParameter("@pageCount",SqlDbType.Int,4),
                new SqlParameter("@clickType",SqlDbType.VarChar,15),
                new SqlParameter("@keyId",SqlDbType.VarChar,15),
                new SqlParameter("@strWhere",SqlDbType.VarChar,155)              
            };

param[0].Value=""; //为参数赋值

param[1].Value=""

.............................

param[4].Direction= ParameterDirection.Output;   //定义该参数为输出参数

a.如何取得存储过程输出参数:

     pageCount = Convert.ToInt32(scom.Parameters["@pageCount"].Value.ToString());

 

后台代码:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using My.TB_Model;
using My.TB_Dal;

public partial class MY_Main_rightContent : System.Web.UI.Page
{
    public string htmlText = "";
    protected void Page_Load(object sender, EventArgs e)
    {
            if (Session["User"] != null)
            {
                htmlText += BindPage(15, "XT_Bulletin", "NTID", "NT_Type=1", gvBulletin);
            }
            else
            {
                Response.Write("浏览器会话失效,请重新登录系统!!");
                form1.Style["display"] = "none";
            }
    }

    private string BindPage(int pSize, string tableName, string keyId, string strWhere, Control con)
    {
        int pageIndex = 1;
        int pageCount = 1;
        int pageSize = pSize;

        总页数
        int pageYm = 1;

        string clickType = "";
        if (Request.QueryString["cm"] != null)
        {
            clickType = Request.QueryString["cm"].ToString();
        }
        if (Request.QueryString["pageIndex"] != null)
        {
            pageIndex = Convert.ToInt32(Request.QueryString["pageIndex"].ToString());
        }

        SqlParameter[] param ={
                new SqlParameter("@tableName",SqlDbType.VarChar,155),
                new SqlParameter("@pageIndex",SqlDbType.Int,4),
                new SqlParameter("@pageSize",SqlDbType.Int,4),
                new SqlParameter("@pageCurrent",SqlDbType.Int,4),
                new SqlParameter("@pageNumber",SqlDbType.Int,4),
                new SqlParameter("@pageCount",SqlDbType.Int,4),
                new SqlParameter("@clickType",SqlDbType.VarChar,15),
                new SqlParameter("@keyId",SqlDbType.VarChar,15),
                new SqlParameter("@columnName",SqlDbType.VarChar,255),
                new SqlParameter("@strWhere",SqlDbType.VarChar,1000)              
            };
        param[0].Value = tableName;
        param[1].Value = pageIndex;
        param[2].Value = pageSize;
        param[3].Direction = ParameterDirection.Output;
        param[4].Direction = ParameterDirection.Output;
        param[5].Direction = ParameterDirection.Output;
        param[6].Value = clickType;
        param[7].Value = keyId;
        param[8].Value = "*";
        param[9].Value = strWhere;

        DBHelper db = new DBHelper();
        DataSet ds = db.ExcuteProduct("MyPages", param, CommandType.StoredProcedure, out pageCount, out pageIndex, out pageYm);
        if (ds.Tables[0].Rows.Count > 0)
        {
            ((GridView)con).DataSource = ds;
            ((GridView)con).DataBind();
        }
        else
        {
            Command.ShowHeadMethod(ds, ((GridView)con));
        }

        int a = (pageIndex - 6) <= 0 ? 1 : (pageIndex - 6);
        int b = (pageIndex + 6) >= pageYm ? pageYm : (pageIndex + 6);

        htmlText += "<div id=\"pre\" class=\"page\"><a href=\"rightContent.aspx?pageIndex=" + pageIndex + "&cm=pre" + "\"><<</a></div><div class=\"page\">";
        for (int i = a; i <= b; i++)
        {
            htmlText += "<a id=\"L" + i.ToString() + "\" href=\"rightContent.aspx?pageIndex=" + i.ToString() + "\">" + i.ToString() + "</a>";
        }
        htmlText += "</div><div id=\"next\" class=\"page\"><a href=\"rightContent.aspx?pageIndex=" + pageIndex + "&cm=next" + "\">>></a></div>";

        htmlText += "<div class=\"page\"><a style=\"background-image:url(../Images/btn.png);background-repeat:repeat-x;color:white;\">总记录:<font style=\"color:red\">" + pageCount.ToString() + "</font>,页码: <font style=\"color:red\">" + pageIndex + "</font> /" + pageYm.ToString() + " 转到<input type=\"text\" id=\"txtNumber\" style=\"width:31px;height:12px; margin-top:-5px;text-align: center\" value=\"" + pageIndex.ToString() + "\" οnfοcus=\"this.value=''\" οnkeyup=\"this.value=this.value.replace(/\\D/g,'')\" /> 页</a><a href=\"javascript:void(0)\" οnclick=\"GoTo(" + pageYm + ",'../rightContent.aspx'" + ")\">Go</a></div>";
        if (b != 0)
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "xa", "pageActive(" + pageIndex + "," + pageYm + ")", true);
        }
        return htmlText;
    }

    protected void gvBulletin_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes["id"] =e.Row.RowIndex.ToString();
            e.Row.Attributes.Add("onclick", "selectx(this,'" + e.Row.RowIndex.ToString() + "')");
            //e.Row.Attributes.Add("ondblclick", "open5(800,550,'XT_Manager/xt_BullDetail.aspx',1,'gvBulletin',1)");  //实现双击事件
            e.Row.Attributes.Add("ondblclick", "openPrint(800,550,'XT_Manager/xt_BullDetail.aspx','"+e.Row.Cells[1].Text+"')");
        }
        //实现自动编号
        //if (e.Row.RowIndex != -1)
        //{
        //    int id = e.Row.RowIndex + 1;
        //    e.Row.Cells[0].Text = id.ToString();
        //}
    }
    protected void gvBulletin_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "titles")
        {
            ClientScript.RegisterStartupScript(this.GetType(), "bx", "<script>openPrint(800,550,'XT_Manager/xt_BullDetail.aspx','" + e.CommandArgument.ToString() + "')</script>");
        }
    }
}

 

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="rightContent.aspx.cs" Inherits="MY_Main_rightContent" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>right内容区域</title>
    <link type="text/css" rel="stylesheet" href="Style/MyPage.css" />
    <script type="text/javascript" src="Js/zDrag.js"></script>
    <script type="text/javascript" src="Js/zDialog.js"></script>
</head>
<body>
    <form id="form1" runat="server">
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
            <tr>
                <td style="height: 30px; background: url(Images/tab_05.gif)">
                    <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                            <td style="width: 12px; height: 30px">
                                <img src="Images/tab_03.gif" width="12" height="30" alt="" /></td>
                            <td>
                                <div style="float: left;">
                                    <img src="Images/tb.gif" alt="" /></div>
                                <div style="float: left; line-height: 16px; width: 229px;">
                                    &nbsp;您当前的位置:当前主页&gt;&gt;系统公告
                                </div>
                            </td>
                            <td style="width: 16px">
                                <img src="Images/tab_07.gif" width="16" height="30" alt="" /></td>
                        </tr>
                    </table>
                </td>
            </tr>
            <tr>
                <td valign="top">
                    <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                            <td style="width: 8px; background: url(Images/tab_12.gif);">
                            </td>
                            <td>
                                <table border="0" cellpadding="0" cellspacing="0" style="width: 100%">
                                    <tr>
                                        <td colspan="2">                                      
                                          <div id="gvDiv" class="gvBorder" style="height:auto;">
                                            <asp:GridView ID="gvBulletin" runat="server" AutoGenerateColumns="False" Width="100%" CssClass="gridview_m" OnRowDataBound="gvBulletin_RowDataBound" OnRowCommand="gvBulletin_RowCommand">
                                                <Columns>
                                                    <asp:BoundField DataField="Row" HeaderText="序号">
                                                        <ItemStyle Width="40px" />
                                                    </asp:BoundField>
                                                    <asp:BoundField DataField="NTID" HeaderText="系统编号" >
                                                        <ItemStyle Width="90px" />
                                                    </asp:BoundField>
                                                    <asp:TemplateField HeaderText="公告主题">
                                                        <EditItemTemplate>
                                                            <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("NT_Content") %>'></asp:TextBox>
                                                        </EditItemTemplate>
                                                        <ItemTemplate>
                                                          <div style="padding-left:5px; text-align:left;">
                                                            <asp:LinkButton ID="lkContent" runat="server" CommandName="titles" CommandArgument='<%# Eval("NTID") %>' Text='<%# Eval("NT_Content") %>'></asp:LinkButton>
                                                         </div>
                                                        </ItemTemplate>
                                                    </asp:TemplateField>
                                                    <asp:BoundField DataField="NT_Sender" HeaderText="发布人" />
                                                    <asp:TemplateField HeaderText="发布日期">
                                                        <EditItemTemplate>
                                                            <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("NT_Time") %>'></asp:TextBox>
                                                        </EditItemTemplate>
                                                        <ItemTemplate>
                                                            <asp:Label ID="Label1" runat="server" Text='<%# Eval("NT_Time", "{0:yyyy-MM-dd}") %>'></asp:Label>
                                                        </ItemTemplate>
                                                    </asp:TemplateField>
                                                </Columns>
                                                <SelectedRowStyle Font-Bold="True" />
                                                <HeaderStyle CssClass="gridview_head" Font-Bold="True" />
                                            </asp:GridView>
                                         </div>
                                        </td>
                                    </tr>
                                </table>
                            </td>
                            <td style="width: 8px; background: url(Images/tab_15.gif)">
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
            <tr>
                <td style="height: 35px; background: url(Images/tab_19.gif);">
                    <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                            <td style="width: 12px; height: 35px">
                                <img src="Images/tab_18.gif" width="12" height="35" alt="" /></td>
                            <td style="padding-bottom:5px;">
                                <asp:TextBox ID="txtHidd" runat="server" style="display:none; width:1px"></asp:TextBox>
                                <%=htmlText %>
                            </td>
                            <td style="width: 16px">
                                <img src="Images/tab_20.gif" width="16" height="35" alt="" /></td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在SQL Server中,可以使用ROW_NUMBER()函数进行分页查询。ROW_NUMBER()函数会为结果集中的每一行分配一个唯一的数字,该数字从1开始依次递增。我们可以利用这个函数来实现分页查询。 下面是一个例子: 假设我们有一个名为"employees"的表,其中包含员工的姓名和工资信息。我们想要查询前10个工资最高的员工,并按照工资降序排列。 我们可以使用如下的SQL语句来实现: ``` SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS rownum, * FROM employees ) AS temp WHERE rownum BETWEEN 1 AND 10 ``` 上述SQL语句中,ROW_NUMBER()函数被用来为每一行分配一个数字,按照工资降序排列。然后,我们将该子查询嵌套在一个外部查询中,并利用WHERE子句来选择第1到第10行,从而实现了分页查询。 ### 回答2: 在SQL Server中,可以使用ROW_NUMBER函数进行分页查询。ROW_NUMBER函数是一种窗口函数,它可以为查询结果中的每一行分配一个唯一的行号。 以下是使用ROW_NUMBER进行分页查询的基本语法: ``` SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY column) AS RowNum FROM table ) AS SubQuery WHERE RowNum BETWEEN @startRow AND @endRow ``` 在上述语法中,`column`是用于排序的列名,`table`是要查询的表名,`@startRow`和`@endRow`是指定的分页起始行和结束行。 首先,ROW_NUMBER函数被应用于子查询,它会为每一行生成一个行号。`ORDER BY`子句用于确定行号的顺序。 然后,在外部查询中,我们可以使用`WHERE`子句来过滤我们想要的行号范围。 例如,如果我们想要查询第1行到第10行的数据,我们可以将`@startRow`设置为1,`@endRow`设置为10。 需要注意的是,ROW_NUMBER是基于查询结果集的顺序生成行号,而不是基于表的物理顺序。因此,如果没有明确指定`ORDER BY`子句,结果可能是不确定的。 使用ROW_NUMBER函数进行分页查询能够有效地提取出我们所需的数据,并且还可以通过调整`@startRow`和`@endRow`的值来获取不同的分页结果。 ### 回答3: 在SQL Server中,可以使用ROW_NUMBER()函数来实现分页查询。ROW_NUMBER()函数会按照指定的排序规则对结果集进行排序,并为每一行赋予一个序号。通过指定分页起始位置和每页的行数,可以得到想要的分页结果。 例如,假设有一个名为"Products"的表,我们需要按照价格降序排列并进行分页查询,每页显示10条记录。可以使用以下SQL语句实现: ```sql SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY Price DESC) AS RowNum, * FROM Products ) AS P WHERE RowNum BETWEEN 1 AND 10 ``` 在这个查询中,使用ROW_NUMBER()函数为结果集中的每一行赋予一个序号,并按照价格降序进行排序。然后在外部查询中,通过WHERE子句指定了分页的起始位置和每页的行数,这里的起始位置为1,结束位置为10,表示获取第1页的数据,每页10条记录。 通过这种方式,可以方便地实现分页查询。在实际应用中,可以根据需要调整分页起始位置和每页的行数,以实现更复杂的分页需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值