如何解决存储过程?

时间:2010-11-18 02:39:31

标签: sql sql-server-2008

在SQL Server中对存储过程进行故障排除的最佳方法是什么,我的意思是从哪里开始等...?

4 个答案:

答案 0 :(得分:1)

  1. 测试存储过程之外的每个SELECT语句(如果有),看它是否返回预期结果;
  2. 尽可能简化INSERTUPDATE语句;
  3. 尝试在SP外部测试插入和更新,以便您可以检查它是否给出预期结果;
  4. 使用随SSMS Express 2008提供的调试程序。

答案 1 :(得分:1)

Visual Studio 2008/2010有一个调试工具。只需在“服务器资源管理器”中连接到您的SQL Server实例,然后浏览到您的存储过程。

Visual Studio'Test Edition'也可以围绕您的存储过程生成单元测试。

答案 2 :(得分:1)

对复杂存储过程进行故障排除远不只是确定是否可以运行它并找到不会运行的步骤。最关键的是它是否实际返回核心结果或执行正确的操作。

有两种存储过程需要广泛的abilites才能进行故障排除。首先是创建动态SQL的proc。如果没有@debug的输入参数,我永远不会创建其中一个。设置此参数后,我将proc打印SQl语句,因为它将运行并且不运行它。几乎每次都会引导您立即解决问题,因为您可以在生成的SQL代码中看到语法错误。您还可以运行此sql代码以查看它是否返回了您期望的记录。

现在,复杂的proc有许多影响数据的步骤,我总是使用@test输入参数。我对@test参数做了两件事,首先我让它回滚动作,这样开发中的错误就不会弄乱数据。其次,我让它在回滚之前显示数据,看看结果会是什么。 (这些实际上在proc中以相反的顺序出现;我只是按此顺序考虑它们。)

现在,我可以看到表格中的内容或从表格中删除的内容,而不会影响数据的持久性。有时,我可能会先选择任何操作之前的数据,然后将其与之后的选择运行进行比较。

最后,我经常想记录复杂过程的动作并确切地看到发生了什么步骤。如果proc遇到错误,我不希望这些日志被回滚,所以我在proc开始时为我想要的日志信息设置了一个表变量。在每个步骤之后(或根据我想要记录的错误之后),我插入此表变量。在rollback或commit语句之后,我选择表变量的结果或使用这些结果登录到永久日志记录表。如果您使用动态SQL,这可能会特别好,因为您可以记录运行的SQL,然后当prod上的某些奇怪的内容失败时,您会记录失败时运行的语句。您可以在表变量中执行此操作,因为这些变量不会在回滚中超出范围。

答案 3 :(得分:-1)

在SSMS中,您只需打开proc。,然后单击菜单栏上Execute按钮旁边的复选标记按钮(Parse)即可。它会报告发现的任何错误。

如果那里没有错误并且你的存储过程对运行无害(你没有插入表,只是创建一个临时表),那么注释掉CREATE PROCEDURE x(或ALTER PROCEDURE x)并通过复制该部分声明所有参数,然后使用有效值定义它们。然后运行它看看会发生什么。

也许这很简单,但这是一个开始的地方。