SqlServer存储过程及调试指南

所需积分/C币:39 2013-05-17 13:55:07 684KB PDF
29
收藏 收藏
举报

详细介绍了SqlServer的存储过程调试方法,适合初学者及想深入研究的开发人员
osearchdatabase.com.cn TechTarget TT数辑库 TT中国 令 SQL Server中使用游标进行行处理 ◆存储过程与嵌套査询优化 ☆ SQL Server中的视图与UDF性能问题 ◆ SQL Server不必要的记录锁 ◇解决 SQL Server触发器滥用问题 ◇如何诊断和修复T-SQL问题 SQL Server存储过程的修改与变更 影口日 在对 SQL Server存储过程进行修改和变更时,往往会遇到各和各样的错误和问题, 这可能是由于与现有数据库函数冲突造成的。本部分介绍了如何对存储过程进行升级与批 量修改,而不造成错误的方法。 ◇批量编辑 SQL Server存储过程 在 SQL Server2005中升级存储过程 数据库技术专题之“ 存储过程调试指商” osearchdatabase.com.cn TechTarget TT数辑库 TT中国 SQL Server中使用异常处理调试存储过程(上) 异常处理被普遍认为是T-SQL脚本编程中的最弱的方面。幸运的是,这一点在SQL Server2005中得到了改变,因为 SQL Server2005支持结构化异常处理。本文首先关注 浙特性“TRY…… CATCH”的基本构成,然后在 SQL Server2000和 SQL Server2005中对 照着看一些TSQL的例子,这些例子中使用事务代码故意制造了一些违反约束限制的情况。 将来的文章会继续探讨这一主题 在 SQL Server之前的版本中,你需要在执行 INSERT, UPDATE, DELETE之后立即检查 全局变量“@@ error”来处理异常,如果“@@ error”变量不为零的话(表示有错误),就 接着执行一些纠正动作。开发人员常常重复这种与业务逻辑无关的代码,这会导致重复代 码块,而且需要与GOT0语句和 RETURN语句结合使用。 结构化异常处理为控制具有许多动态运行时特性的复杂程序提供了一种强有力的处理 机制。目前,这种杋制经实证岄是良好的,许多流行的编程语言(比如:微软的 Visual Basic.Net和 Visual c#)都支持这种异常处理机制。接下来你会在例子中看到,采用了 这种健壮的方法以后,会使你的代码可读性和可维护性更好。TRY块包含了可能澘在失败 的事务性代码,而 CATCH块包含了TRY块中出现错误时执行的代码。如果TRY块中出现了 任何错误,执行流程被调转到 CATCH块,错误可以被处理,而出错函数可以被用来提供详 细的错误信息。TRY……CATC基本语法如下 BEGIN TRY RAISERROR (Houston, we have a problem, 16, 1) END TRY BEGIN CATCH sELECt ERROR NUMBER as ERROR NUMBER ERROR SEVERITY HS ERROR SEVERITY ERROR STATE ( aS ERROR STATE ERROR MESSAGE as ERROR MESSAGE END CATCH 数据库技术专题之“ 存储过程调试指商” osearchdatabase.com.cn TechTarget TT数辑库 TT中国 注意上面脚本屮函数的用法,我们可以用它们代替局部变量和(或者)全局变量。这 些函数只应该被用在 CATCH块中,函数功能说明如下 ERROR NUMBER()返回错误数量。 ERROR SEVERITY()返回错误严重等级。 ERROR STATE()返回错误状态号 ERROR PROCEDURE()返回出错位置存储过程或者触发器的名称 ERROR LINE()返回程序中引起错误的行号。 ERROR MESSAGE()返回错误信息的完整文本。错误内容包括可替换参数的值,比如 长度,对象名称或者时间。 我会先用 SQL Server2000演示一个简单例子,然后演示一个 SQL Server2005异常 处理的例子。 下面是一个简单的存储过程示例,先用 SQL Server2000编写,然后改用 SQL Server 2005实现。两者都从简单的表开始,我们在对这些表执行插入操作时会违反约東限制。下 面是表结构: create table dbo. Titles (TitleId int Primary Key identity TitleName nvarchar(128) NOT NULL Price money NUll constraint CHK Price check (Price>0)) create table dbo. Authors (Authors id int primary key identity. au fname nvarchar (32) NULL au Iname nvarchar (64) NULL Titleid int constraint fK TitleId foreign key references Titles (TitleID) CommissionRating int constraint CHK ValidateCommissionRating Check CommissionRating between 0 and 100)) create table dbo. application error log (tablename sy sname 数据库技术专题之“ 存储过程调试指商” osearchdatabase.com.cn TechTarget TT数辑库 TT中国 userName sysname errorNumber int, errorSeverity int errorState int errorMessage varchar (4000)) (作者: Serdar Regula1p译者:冯的来源:T中p) 数据库技术专题之“ 存储过程调试指商” osearchdatabase.com.cn TechTarget TT数辑库 TT中国 SQL Server中使用异常处理调试存储过程(下) 点击这里获取存储过程 P Insert New booktitlc2K的源代码。你可以看到,这个存 储过程包含了非结构化的错误处理代码,这是我们在 SQL Server2005之前使用的方式。 我们已经先看到了存储过程 P Insert new booktitle2K中使用的代码。你顶多能说: “至少我们有异常处理。”下亩的语句执行这个 SQL Sorver2000下的存储过程。 exec P Insert New BookTitle 2K red Storm Rising, 16.99 Tom,' Clancy, 200 在用指定的参数执行存储过程时,对 Authors表的插入失败了,因为佣金费率值无效。 我们的约束检查发现了该无效值,我们可以看到如下错误信息: Msg 547. level 16. state o. procedure p insert new booktitle, line 23 the insert statement conflicted with the check constraint CHK ValidateCommissionRating". The conflict occurred in database Adventureworks2005", table dbo. Authors", column CommissionRating. The statement has been terminated 这里的问题是我们不能阻止这些消息被送到客户端。所以判断哪里出错的重担就放到 了客户端的头上。令人遗憾的是,在有些情况下,这样的结果对于一些不使用约束限制的 应用程序可能足够了。 我们再来试一次,这次我们使用TRY……CATC代码块。 点击这里获取存储过程 P Insert new eω okTitle2K5的源代码。在这段新改进的存 储过程中,我们看到使用了TRY……… CATCH代码块的结构化错误处理: 要注意 SQL Server205异常处理代码是经过简化的,因此具有更好的可读性和可维 护性。不需要剪切和粘贴异常处理代码,也不需要使用GoTO语句。执行该存储过程时, 你可以看到如下结果: 数据库技术专题之“ 存储过程调试指商” osearchdatabase.com.cn TechTarget TT数辑库 TT中国 exec P Insert New BookTitle 2K5 Red Storm Rising, 16. 99, Tom,' Clancy, 200 我们用指定的参数执行存储过程,同样因为佣金费率值无效,对 Authors表的插入失 败了。错误发生时,程序执行流程跳转到了 CATCH代码块,在 CATCH代码垬屮我们回滚了 事务,然后用 SQL Server2005自带的函数给 Application Error log表插入一行日志。 新的TRY… CATCH代码块无疑使编写处理错误代码更容易,它还可以在任何时候阻 止错误信息发送到客户端。当然这可能需要T-SL程序员的编程思维有一个转变,这是 个绝对有必要使用的特性。要记住迁移 SQL Server2000代码到 SQL Server2005时,如 果程序的错误处理机制已经设计为旧的发送错误到客户端的方式,那你可能不得不修改应 用程序了。从长远来看,我相信为这种潜在的问题付出努力重新设计是值得的。 (作者: Serdar regu1al译者:冯所作来源:TT中国) 数据库技术专题之“ 存储过程调试指商” osearchdatabase.com.cn TechTarget TT数辑库 TT中国 怎样调试TSQL存储过程(一) 我公执行(或者单步执行)一个TSQL冇储过程示例程序,并在调试过程中执行以卜 操作:给输入参赋值,监视变量内容,在运行过程中跟踪存储过稈的逻辑流稈,估算T SL表达式的值,査看储存过程输出内容,设置断点,大体检査环境状态。(后面的技巧 文章会继续探讨这些主题)。我们演示示例存储过程时,不是在 Management studio中调 试,而是在 Visual studio2005开发环境中调试。我提到这一点是因为在 SQL Server 2000下,我们可以使用 Query Analyzer调试存储过程。可能将来 Management studio也 会增加对调试功能的支持。 T-SQL示例存储过程:P_ DisplayproductDetails 我们使用的存储过程示例使用函数来根据单价给每一个产品子类排序,从 AdventureWorks数据库中査询产品明细信息。该存储过程接收产品类别名作为一个可选入 参。几个输出参数会给调用它的分支返回有用的信息。最后,止如前面的文章讲到的,该 存储过程使用了“结构化异常处理” Use AdventureWorks GO IF EXISTS (SELECT FROM Sysob jects WheRE type-P AND name=P DisplayProductDetails') DROP Procedure P DisplayProductDetails CREATE Procedure P DisplayProductDetails (@Categoryname varchar (50)= NULI (MatchingRows int = NULL OUTPUT @ErrorString varchar (128)= NULL OUTPUT @ErrorNumber int NULL OUTPUT BEGIN TRY 添加一个‘%(模糊查询),这样调用者不需要知道子类的完整名称 if @CategoryName is null select @CategoryName = e se 数据库技术专题之“ 存储过程调试指商” osearchdatabase.com.cn TechTarget TT数辑库 TT中国 select @CategoryName =@CategoryName + 使用rank函数,根据子类名称按 ListPrice字段排名 DENSE RANK函数分配相邻值 SELECT Production, Product. ProducLID Production Product Name As ProductName Production. ProductCategory Name As CategoryName Production. Product Subcategory Name AS SubcategoryName Production Product ListPrice DENSE RANK( over Partition b Production. ProductSubcategory Name ORDER BY Production. Product, listPrice desc as pricerank FROM Production Product INNER JOIN Production. ProductSubcatcgory ON Production. Product Product Subcategory id Production. ProductSubcategory Productsubcategory id INNER JOIN Production. ProductCategory ON Production Product Subcategory ProductCategory Id Production. ProductCategory Product Category id WHERE Production. ProductCategory Name like @Category Name ORDER BY Production Product Category Name select @MatchingRows =@@ROWCOUNT 0 END TRY BEGIN CATCH 把错误信息记永日志……在调试时,我们可能会跳过这一步! insert dho Application Error Log (UserName, errorNumber error Severity, errorState, errorMessage) values (suser sname () ERROR NUMBER () ERROR SEVERITY O ERROR STATE () ERROR MESSAGE () SELECT GErrorNumber ERROR NUMBER () @Error String= ERROR MESSAGE ( Raiserror ( @ErrorString, 16, 1) END CATCH (作者: Serdar regula1p译者;冯的作米源:T中) 数据库技术专题之“ 存储过程调试指商”

...展开详情
试读 31P SqlServer存储过程及调试指南
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
上传资源赚积分or赚钱
    最新推荐
    SqlServer存储过程及调试指南 39积分/C币 立即下载
    1/31
    SqlServer存储过程及调试指南第1页
    SqlServer存储过程及调试指南第2页
    SqlServer存储过程及调试指南第3页
    SqlServer存储过程及调试指南第4页
    SqlServer存储过程及调试指南第5页
    SqlServer存储过程及调试指南第6页
    SqlServer存储过程及调试指南第7页

    试读结束, 可继续读3页

    39积分/C币 立即下载 >