赛迪网 > IT技术 数据库 > 精彩更新
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

存储过程中如何执行带输出参数的动态SQL

发布时间:2008.05.06 05:09     来源:赛迪网    作者:Eden

【赛迪网-IT技术报道】SQL Server存储过程中执行带输出参数的动态sql是很多人经常碰到的问题,比如根据一些条件查询列表,并返回记录数等。下面是一个参考示例,查询用户列表,它可以利用临时表实现翻页,并带有死锁和超时检测功能。

CREATE procedure pUserList

(

@UserType char(2),

@pagenum int,

@perpagesize int,

@pagetotal int out,

@rowcount int out

)

as

set nocount on

DECLARE @Err INT,@ErrCounter INT

declare @sql nvarchar(2000) --声明动态sql执行语句

declare @pagecount int --当前页数

declare @sWhere nvarchar(200)

declare @sOrder nvarchar(100)

set @sWhere = ' where 1=1 '

if not(@UserType is null)

set @sWhere = @sWhere + ' and UserType = ' + @UserType

set @sOrder = ' order by UserID '

--取得当前数据库的记录总数

declare @row_num int

LockTimeOutRetry:

--创建临时表,作为数据过滤

create table #change (T_id int)

set @sql = 'select @row_num=count(*) from dbo.[User]' + @sWhere

exec sp_executesql @sql,N'@row_num int output', @row_num output

if @row_num % @perpagesize =0

set @pagetotal = @row_num/@perpagesize

else

set @pagetotal = @row_num/@perpagesize + 1

set @rowcount = @row_num

if @row_num > @perpagesize

begin

set @row_num = @pagenum * @perpagesize

if @row_num = @perpagesize

begin

set @sql = N'select top ' + cast(@perpagesize as varchar)

+ ' UserID,LoginName,RealName from dbo.[User]' + @sWhere + @sOrder

exec sp_executesql @sql

SET @Err = @@ERROR

IF @Err <> 0 GOTO ErrorHandler

return 0

end

else

begin

set @row_num = (@pagenum-1) * @perpagesize

set @pagecount = @row_num

set @sql=N'insert #change (T_id) select top '

+ cast(@pagecount as varchar) + ' UserID from dbo.

[User] '+@sWhere+' and UserID not in (select T_id from #change)' + @sOrder

exec sp_executesql @sql

set @sql = N'select top ' + cast(@perpagesize as varchar) + ' UserID,LoginName,RealName from dbo.[User] '+@sWhere+' and UserID not in (select T_id from #change)' + @sOrder

exec sp_executesql @sql

SET @Err = @@ERROR

IF @Err <> 0 GOTO ErrorHandler

return 0

end

end

else

begin

set @sql = 'select UserID,LoginName,RealName

from dbo.[User]' + @sWhere + @sOrder

exec sp_executesql @sql

SET @Err = @@ERROR

IF @Err <> 0 GOTO ErrorHandler

return 0

end

ErrorHandler:

IF (@Err = 1222 OR @Err = 1205) AND @ErrCounter = 5

BEGIN

RAISERROR ('Unable to Lock Data after five attempts.', 16,1)

return -100

END

IF @Err = 1222 OR @Err = 1205 -- Lock Timeout / Deadlock

BEGIN

WAITFOR DELAY '00:00:00.25'

SET @ErrCounter = @ErrCounter + 1

GOTO LockTimeOutRetry

END

-- else unknown error

RAISERROR (@err, 16,1) WITH LOG

return -100

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO

(责任编辑:卢兆林)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 使用VS 2005和SQL Server 2005创建连接 (04-21) · 教你快速掌握一个交叉表的通用存储过程 (04-20)
· 在SQL Server 2005数据库中修改存储过程 (04-09) · 调用存储过程时注意要使用output做修饰符 (04-08)
· MySQL存储过程SAVEPOINT ROLLBACK to (04-06) · 教你通过任务和管道异步调用存储过程 (03-22)
· 关于存储过程能否用在项目中的思考 (02-02) · Oracle存储过程中任务和管道的应用 (01-22)
· SQL Server存储过程编写和优化措施 (01-16) · 用.NET调用oracle存储过程返回记录集 (12-04)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 黑客病毒现身互联网 个人数据信息受威胁
· ERP实施过程中项目管理失控的几种表现
· 首届赢在软件创富大赛 SOA技术+应用
· 个人理财合规系统方案 方正电子公文系统
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统