• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

数据库基础:存储过程中如何执行带输出参数的动态SQL

发布: 2008-5-08 18:09 | 作者: GOD | 来源: 希赛网 | 查看: 320次 | 进入软件测试论坛讨论

领测软件测试网

数据库基础:存储过程中如何执行带输出参数的动态SQL

作者:GOD 来源:希赛网 

  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

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

TAG: sql SQL Sql 参数 数据库 过程中 int


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网