最近在看分页存储过程,以前看过就忘看过就忘,还是没有深刻地理解,现在决定仔细地研究一下,谁知在看到exec sp_executesql xxx,xxx,xxx就卡住了,还忘大虾们能细心解释一下。
代码详细地址:
代码详细地址:
解决方案 »
- 关于事务的疑问,请高手指点
- 表里datetime转varchar问题
- 拼凑的sql语句超过8000个字符怎么办?
- 如何将数据以表格形式存入一个字段中,在读出来以表格显示,急!
- 怎么将Access中的数据表导成Excel?
- 怎么样在SQL7里的取时间‘2002-1-1 8:23:12’中的时间。而不要日期??
- SQL 2005的奇怪错误
- 求助!请问在ACCESS中如果使用了自动编码,如果我删除了某记录,如何让它按大小自动重新顺序编码(如把第23条删去,后面的记录顺序往前变
- 一个库表的建立
- SQL Server7.0 中的日期字段如何设置指定格式?
- 事务(进程ID56)与另一个进程被死锁在 锁|通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
- 【高分】Java 连接数据库SqlServer 2005 ,错误:java.sql.SQLException: I/O Error: Unknown packet type 0x44
--/*----- 对数据进行了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
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
我看第二个参数和第三个参数不是一样的么?多此一举吗?
set @sql= 'select @a=count(*) from tableName '
exec sp_executesql @sql,N '@a int output ',@num output
select @num
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
sp_executesql sqlstr,N'参数 就是没有输出参数的执行动态SQL语句的语法
然后,如果有扩充,就再多加个参数(第三个参数),OUTPUT,
不知我的理解对不对?:)
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分,待以后分多了,加了马甲,轮带着奉献给大家。 @_@
动态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
1>0这个条件是肯定成立的,之所以这样写,是因为@strCondition以' and '开头,前面必须有一个条件,拼在一起就是:where (1>0) and clo1>val1这样的,
省略的话就成了:where and clo1>val1,会报语法错误。
Access数据库支持这个语法吗?