关于exec sp_executesql 的问题?

jsyzyr 2010-05-15 10:59:05
第一段是一个存储过程分页的代码

CREATE proc getdataset
@TableList Varchar(200)='*',--搜索表的字段,比如:id,datatime,job,用逗号隔开
@TableName Varchar(30), --搜索的表名
@SelectWhere Varchar(500)='',--搜索条件,这里不用写where,比如:job='teacher' and class='2'
@SelectOrderId varchar(20),--表主键字段名。比如:id
@SelectOrder Varchar(200)='', --排序,可以使用多字段排序但主键字段必需在最前面.也可以不写,比如:order by class asc
@intPageNo int=1, --页号
@intPageSize int=10 ,--每页显示数
@RecordCount int OUTPUT --总记录数(存储过程输出参数)
as

declare @TmpSelect NVarchar(600)
declare @Tmp NVarchar(600)

set nocount on--关闭计数

set @TmpSelect = 'select @RecordCount = count(*) from '+@TableName+' where '+@SelectWhere

execute sp_executesql
@TmpSelect, --执行上面的sql语句
N'@RecordCount int OUTPUT' , --执行输出数据的sql语句,output出总记录数
@RecordCount OUTPUT
if (@RecordCount = 0) --如果没有贴子,则返回零
return 0

/*判断页数是否正确*/
if (@intPageNo - 1) * @intPageSize > @RecordCount --页号大于总页数,返回错误
return (-1)
set nocount off--打开计数
if @SelectWhere != ''
begin
set @TmpSelect = 'select top '+str(@intPageSize)+' '+@TableList+' from '+@TableName+' where '+@SelectOrderId+' not in(select top '+str((@intPageNo-1)*@intPageSize)+' '+@SelectOrderId+' from '+@TableName+' where '+@SelectWhere +' '+@SelectOrder+') and '+@SelectWhere +' '+@SelectOrder
print @TmpSelect
end
else
begin
set @TmpSelect = 'select top '+str(@intPageSize)+' '+@TableList+' from '+@TableName+' where '+@SelectOrderId+' not in(select top '+str((@intPageNo-1)*@intPageSize)+' '+@SelectOrderId+' from '+@TableName+' '+@SelectOrder+') '+@SelectOrder
end
execute sp_executesql @TmpSelect
return(@@rowcount)--@@ROWCOUNT,返回受上一语句影响的行数。
GO

请教的问题是:
execute sp_executesql
@TmpSelect, --执行上面的sql语句
N'@RecordCount int OUTPUT' , --执行输出数据的sql语句,output出总记录数
@RecordCount OUTPUT
这段代码中的N'@RecordCount int OUTPUT'是参数列表,@RecordCount OUTPUT是给参数赋值。这样理解对吗?

第2段代码

USE Factory;
GO
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @SalesOrderNumber nvarchar(25);
DECLARE @IntVariable int;
SET @SQLString = N'SELECT @SalesOrderOUT = MAX(ExportDeptID)
FROM As_Inflexion
WHERE AcceptDeptID = @CustomerID';
SET @ParmDefinition = N'@CustomerID int,
@SalesOrderOUT nvarchar(25) OUTPUT';
SET @IntVariable = 230;
EXECUTE sp_executesql
@SQLString --需要执行的SQL语句
,@ParmDefinition --参数列表
,@CustomerID = @IntVariable --给参数赋值
,@SalesOrderOUT =@SalesOrderNumber OUTPUT;
-- This SELECT statement returns the value of the OUTPUT parameter.
SELECT @SalesOrderNumber;

问题是,@SalesOrderOUT =@SalesOrderNumber OUTPUT;这句代码如果写成,@SalesOrderOUT OUTPUT 就会报错,
但是上面那段分页代码中写成@RecordCount OUTPUT却是正确的,请问是怎么回事啊?
...全文
273 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
htl258_Tony 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jsyzyr 的回复:]
写成:@SalesOrderNumber OUTPUT后报错。
提示错误如下:
必须传递参数个数 4,并以 '@name = value' 的形式传递后续的参数。一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递。

execute sp_executesql
@TmpSelect, N'@RecordCount i……
[/Quote]
这个很简单,大原则是:
如果不显式赋值(也就是如:@变量名='值'),那么要确保各赋值参数的位置与声名的变量位置相对,总数相等,类型相同(或支持隐式转换的类型)
jsyzyr 2010-05-15
  • 打赏
  • 举报
回复
写成:@SalesOrderNumber OUTPUT后报错。
提示错误如下:
必须传递参数个数 4,并以 '@name = value' 的形式传递后续的参数。一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递。

execute sp_executesql
@TmpSelect, N'@RecordCount int OUTPUT' ,
@RecordCount OUTPUT
请问这里N'@RecordCount int OUTPUT' 中的@RecordCount 指的是@TmpSelect中的@RecordCount ,
而@RecordCount OUTPUT中的@RecordCount指的是@RecordCount int OUTPUT --总记录数(存储过程输出参数)中的@RecordCount ,这2个@RecordCount是如何联系起来的啊?谢谢



htl258_Tony 2010-05-15
  • 打赏
  • 举报
回复
请教的问题是:
execute sp_executesql
@TmpSelect, --执行上面的sql语句
N'@RecordCount int OUTPUT' , --执行输出数据的sql语句,output出总记录数
@RecordCount OUTPUT
这段代码中的N'@RecordCount int OUTPUT'是参数列表,@RecordCount OUTPUT是给参数赋值。这样理解对吗?

--对。

问题是,@SalesOrderOUT =@SalesOrderNumber OUTPUT;这句代码如果写成,@SalesOrderOUT OUTPUT 就会报错,
但是上面那段分页代码中写成@RecordCount OUTPUT却是正确的,请问是怎么回事啊?
--可以写成:@SalesOrderNumber OUTPUT,后面那部份是赋值,@SalesOrderOUT 只是过程中的参数而已并不是赋值。
rucypli 2010-05-15
  • 打赏
  • 举报
回复
语法。。。

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧