怎样调试T-SQL存储过程(一)

日期: 2009-08-06 作者:Joe Toscano翻译:冯昀晖 来源:TechTarget中国 英文

我会执行(或者单步执行)一个T-SQL存储过程示例程序,并在调试过程中执行以下操作:给输入参赋值,监视变量内容,在运行过程中跟踪存储过程的逻辑流程,估算T-SQL表达式的值,查看储存过程输出内容,设置断点,大体检查环境状态。(后面的技巧文章会继续探讨这些主题)。我们演示示例存储过程时,不是在Management Studio中调试,而是在Visual Studio 2005开发环境中调试。我提到这一点是因为在SQL Server 2000下,我们可以使用Query Analyzer调试存储过程。

可能将来Management Studio也会增加对调试功能的支持。   T-SQL示例存储过程:P……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

我会执行(或者单步执行)一个T-SQL存储过程示例程序,并在调试过程中执行以下操作:给输入参赋值,监视变量内容,在运行过程中跟踪存储过程的逻辑流程,估算T-SQL表达式的值,查看储存过程输出内容,设置断点,大体检查环境状态。(后面的技巧文章会继续探讨这些主题)。我们演示示例存储过程时,不是在Management Studio中调试,而是在Visual Studio 2005开发环境中调试。我提到这一点是因为在SQL Server 2000下,我们可以使用Query Analyzer调试存储过程。可能将来Management Studio也会增加对调试功能的支持。

  T-SQL示例存储过程:P_DisplayProductDetails

  我们使用的存储过程示例使用函数来根据单价给每一个产品子类排序,从AdventureWorks数据库中查询产品明细信息。该存储过程接收产品类别名作为一个可选入参。几个输出参数会给调用它的分支返回有用的信息。最后,正如前面的文章讲到的,该存储过程使用了“结构化异常处理”。

  Use AdventureWorks
  GO
  IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND
  name = 'P_DisplayProductDetails')
  DROP Procedure P_DisplayProductDetails
  GO
  CREATE Procedure P_DisplayProductDetails
  (@Categoryname varchar(50) = NULL,
  @MatchingRows int = NULL OUTPUT,
  @ErrorString varchar(128) = NULL OUTPUT,
  @ErrorNumber int = NULL OUTPUT)
  as
  BEGIN TRY
  -- 添加一个‘%’(模糊查询),这样调用者不需要知道子类的完整名称
  if @CategoryName is null
  select @CategoryName = '%'
  else
  select @CategoryName = @CategoryName + '%'
  -- 使用rank函数,根据子类名称按ListPrice字段排名
  -- DENSE_RANK函数分配相邻值
  SELECT Production.Product.ProductID,
  Production.Product.Name AS ProductName,
  Production.ProductCategory.Name AS CategoryName,
  Production.ProductSubcategory.Name AS SubcategoryName,
  Production.Product.ListPrice,
  DENSE_RANK() over (Partition by
  Production.ProductSubcategory.Name ORDER BY
  Production.Product.ListPrice DESC) as PriceRank
  FROM Production.Product
  INNER JOIN Production.ProductSubcategory
  ON Production.Product.ProductSubcategoryID =
  Production.ProductSubcategory.ProductSubcategoryID
  INNER JOIN Production.ProductCategory
  ON Production.ProductSubcategory.ProductCategoryID =
  Production.ProductCategory.ProductCategoryID
  WHERE Production.ProductCategory.Name like @CategoryName
  ORDER BY Production.ProductCategory.Name
  select @MatchingRows = @@ROWCOUNT
  return 0
  END TRY
  BEGIN CATCH
  --把错误信息记录日志……在调试时,我们可能会跳过这一步!
  insert dbo.Application_Error_Log (UserName, errorNumber,
  errorSeverity, errorState, errorMessage)
  values (suser_sname(), ERROR_NUMBER(),ERROR_SEVERITY(),
  ERROR_STATE(), ERROR_MESSAGE())
  SELECT @ErrorNumber = ERROR_NUMBER(),
  @ErrorString = ERROR_MESSAGE()
  RAISERROR (@ErrorString, 16,1)
  END CATCH

相关推荐