最近在看分页存储过程,以前看过就忘看过就忘,还是没有深刻地理解,现在决定仔细地研究一下,谁知在看到exec sp_executesql xxx,xxx,xxx就卡住了,还忘大虾们能细心解释一下。
代码详细地址:

解决方案 »

  1.   

    --/*-----存储过程 分页处理 SW 2005-03-28创建 -------*/
    --/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/
    --/*-----存储过程 分页处理  2005-04-21修改 添加Distinct查询功能-------*/
    --/*-----存储过程 分页处理  2005-05-18修改 多字段排序规则问题-------*/
    --/*-----存储过程 分页处理  2005-06-15修改 多字段排序修改-------*/
    ALTER PROCEDURE dbo.proc_ListPage
    (
    @tblName     nvarchar(200),        ----要显示的表或多个表的连接
    @fldName     nvarchar(500) = '*',    ----要显示的字段列表
    @pageSize    int = 1,        ----每页显示的记录个数
    @page        int = 10,        ----要显示那一页的记录
    @pageCount    int = 1 output,            ----查询结果分页后的总页数
    @Counts    int = 1 output,                ----查询到的记录数
    @fldSort    nvarchar(200) = null,    ----排序字段列表或条件
    @Sort        bit = 0,        ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
    @strCondition    nvarchar(1000) = null,    ----查询条件,不需where
    @ID        nvarchar(150),        ----主表的主键
    @Dist                 bit = 0           ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
    )
    AS
    SET NOCOUNT ON
    Declare @sqlTmp nvarchar(1000)        ----存放动态生成的SQL语句
    Declare @strTmp nvarchar(1000)        ----存放取得查询结果总数的查询语句
    Declare @strID     nvarchar(1000)        ----存放取得查询开头或结尾ID的查询语句Declare @strSortType nvarchar(10)    ----数据排序规则A
    Declare @strFSortType nvarchar(10)    ----数据排序规则BDeclare @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
      

  2.   

    不好意思,CSDN太慢,我打开我发布的帖子,老是打不开
    exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
    我看第二个参数和第三个参数不是一样的么?多此一举吗?
      

  3.   

    --如何将exec执行结果放入变量中?  declare   @num   int,   @sql   nvarchar(4000)  
    set   @sql= 'select   @a=count(*)   from   tableName   '  
    exec   sp_executesql   @sql,N '@a   int   output ',@num   output  
    select   @num  
      

  4.   

    第二个参数是为@strTmp中的语句定义的,第三个参数是用作回传的。
      

  5.   

    create table tb(id int,name varchar(50))
    insert into tb select 1,'a'
    insert into tb select 2,'b'
    insert into tb select 3,'b'
    declare @num1 int,@num2 int,@sql nvarchar(4000)  
    set @sql= 'select @a=count(distinct id),@b=count(distinct name) from tb'  
    exec sp_executesql @sql,N'@a int output,@b int output',@num1 output,@num2 output  
    select @num1 as [不重复id],@num2 as [不重复name]不重复id 不重复name
    3 2
      

  6.   

    哦,我有些明白了,照理说,执行
    sp_executesql sqlstr,N'参数 就是没有输出参数的执行动态SQL语句的语法
    然后,如果有扩充,就再多加个参数(第三个参数),OUTPUT,
    不知我的理解对不对?:)
      

  7.   

    第二个问题:
    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 
    里面的where(1>0)为什么要这样写,省略后会有什么错误 ?实在不好意思,我的分不多了,只能给100分,待以后分多了,加了马甲,轮带着奉献给大家。  @_@
      

  8.   

    参考——3.输出参数
    动态sql语句基本语法 
    1 :普通SQL语句可以用Exec执行 eg:   Select * from tableName 
             Exec('select * from tableName') 
             Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg:   
    declare @fname varchar(20) 
    set @fname = 'FiledName' 
    Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
    Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 
    declare @fname varchar(20) 
    set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功 
    exec sp_executesql @s   -- 此句会报错 declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s)                -- 成功     
    exec sp_executesql @s   -- 此句正确 3. 输出参数 
    declare @num int, 
            @sqls nvarchar(4000) 
    set @sqls='select count(*) from tableName' 
    exec(@sqls) 
    --如何将exec执行结果放入变量中? declare @num int, 
                   @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num 
      

  9.   


    1>0这个条件是肯定成立的,之所以这样写,是因为@strCondition以' and '开头,前面必须有一个条件,拼在一起就是:where (1>0) and clo1>val1这样的,
    省略的话就成了:where and clo1>val1,会报语法错误。
      

  10.   

    完全不是多此一举.因为 @strTmp 里用到.
      

  11.   

    BTW:我们好像在昵称PK大赛上相遇过,,,
      

  12.   

    sp_executesql
    Access数据库支持这个语法吗?
      

  13.   

    SQL 2005 何解:exec sp_executesql @strTmp,N'@Counts int out ',@Counts out //正常exec sp_executesql @sql,N'@a int output,@b int output',@num1 output,@num2 output //多一个参数就出错了,提示 附近有语法错误。