快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

使用SQL Server Profiler捕获存储过程执行

请联系QQ:1793040 索取软件

问题

人们普遍认为,像现实世界中的任何应用程序一样,任何应用程序都不是理想的,总会有一些东西可以开发,使其变得更好并且更具竞争力。特别是在开发环境中,通常会更频繁地更改代码,以解决问题,满足业务目标,提高性能等。因此,对于许多开发人员而言,研究问题,理解问题并修复错误是他们日常工作的一部分。对于基于数据库的应用程序,有时很难理解问题是在数据库方面还是在应用程序方面。在这种情况下,数据库和应用程序开发人员应合作轻松分析,定位和解决问题。在本文中,我将分享研究SQL Server问题的经验。 使用 SQL Server Profiler的存储过程

假定我们的应用程序仅通过进行存储过程调用来访问数据库。因此,要发现问题,我们需要分析相应存储过程的调用。下面,将描述如何使用 SQL Server Profiler轻松捕获特定的存储过程调用并避免在Profiler中捕获不必要的信息。仅具有有关过程调用的必要信息,将使调试过程更简单,更快捷。好吧,我们将通过一个案例研究来说明这个过程。让我们从创建测试环境开始:

使用大师 
 
   
创建数据库TestDB 
 
   
使用TestDB 
 
   
创建表TestTable 
 
  ID INT主键, 
  Val CHAR1 
 
 
   
插入TestTableIDVal 
值(1'A'),(2'B'),(3'C' 

我们已经创建了带有示例表的示例数据库。现在,我们将创建几个存储过程,这些存储过程由应用程序调用以填充和检索数据。应用程序调用第一个 将数据插入到TestTable中:

创建过程uspInsertData
   @pID INT
   @pVal CHAR1),
   @ResCode VARCHAR10)输出

开始
   开始尝试
  
      开始交易
  
      插入TestTableIDVal
      值(@ pID@ pVal
  
      承诺
  
   结束尝试
   开始比赛
  
      如果@@ TRANCOUNT> 0
         回滚
      
   结束观看
  
   SET @ ResCode ='确定'
  
结束

第二个过程 按其值从表中获取行

使用TestDB

  
创建过程uspGetData
   @pVal CHAR1

开始
   
   SELECT IDVal
   从测试表
   在哪里Val = @ pVal
结束

现在,假设一个应用程序开发人员报告他正在尝试将数据插入表中并从数据库接收到“ OK”。但是,当他通过插入值搜索数据时,他什么也没有收到。我们知道调用了“ uspInsertData”过程以在表中插入一行,因此我们将启动SQL Server Profiler来捕获此过程调用,并要求开发人员重现该问题。为此,我们打开 SQL Server Management Studio(SSMS),然后选择“工具”>“ SQL Server Profiler”:

1个

当Profiler启动时,我们连接到我们的实例:

2

之后,将打开“跟踪属性”窗口:

3

在这里,我们应该为我们的任务选择合适的模板。每个模板提供一组针对特定目的的事件。因为我们只需要跟踪特定的过程调用,而无需任何其他信息,所以我们只对收集有关存储过程调用的信息感兴趣。因此,在此步骤中,问题是我们需要选择哪个模板。实际上,我们几乎可以使用任何模板来捕获有关存储过程调用的信息。但是,由于我们的过程是从应用程序一侧调用的,因此我们要处理远程过程的调用。因此,我们对捕获RPC(远程过程调用)事件感兴趣。例如,我们可以选择“标准(默认)”模板,然后取消选中一些不必要的事件,仅保留与远程存储过程相关的事件:

4

在我们的特定示例中,我们只能保留“ RPC:Completed”。 为了仅选择“ RPC:Completed”事件而不花费时间取消选中其他事件,我们还可以使用空白模板并仅检查相应的事件:

5

在研究远程存储过程调用时,我个人更喜欢选择 “ Tuning”模板来分析这类任务,因为有很多事件主要与存储过程有关。因此,选择此选项时,我们无需手动取消任何选择:

6

要捕获特定的存储过程,我们选择“列过滤器…” 并设置“ TextData”过滤器。如果我们不知道该过程的全名,则可以只键入该过程的一部分:

7

设置过滤器后,我们单击“运行”以开始跟踪:

8

运行跟踪后,我们要求开发人员重现该问题。当他执行一个调用我们的存储过程的操作时,我们可以在探查器上找到该调用。在我们的示例中,我们可以在“ RPC:Completed”中找到过程的执行代码 

9

因此,我们已经捕获了必要的存储过程调用。现在,让我们暂停跟踪,复制执行代码,并将其粘贴到SSMS上进行分析:

声明@ p3 varchar10 
设置@ p3 ='OK' 
exec TestDB”。“ dbo”。“ uspInsertData”; 1 @ pID = 3@ pVal = N'D'@ ResCode = @ p3 输出
选择@ p3 

如果我们在SSMS中执行上面的代码,我们可以看到该过程返回 “ OK”:

10

但是,如果我们尝试选择Val = D的行,则不会得到任何结果:

使用TestDB 
 
   
执行uspGetData 
@pVal = N'D' 
 
11

好了,要找到问题,我们开始调试存储过程的捕获调用:

12

我们可以看到该过程已回滚。这是因为我们试图将重复的ID插入表中,这是唯一的。此外,从调试中可以明显看出,该过程的设计方式错误,并且始终返回 “ OK”(即使失败)。 因此, 发现了问题,我们可以通过修改存储过程来解决它:

更改程序uspInsertData
   @pID INT
   @pVal CHAR1),
   @ResCode VARCHAR10)输出

开始
   开始尝试
  
      开始交易
  
      插入TestTableIDVal
      值(@ pID@ pVal
  
      承诺
  
      SET @ ResCode ='确定'
  
   结束尝试
   开始比赛
  
      如果@@ TRANCOUNT> 0
         回滚
  
      SET @ ResCode ='错误'
  
   结束观看
  
结束

现在,开发人员将收到有关过程结果的正确消息:

13

这是一个非常简单的示例,但是分步说明了如何使用SQL Server Profiler捕获存储过程调用,这通常对于解决数据库相关问题至关重要。尽管在现实情况下,情况通常要复杂得多,但是我们可以以相同的简单方式捕获过程调用,然后使用调试器对其进行分析。

结论

总之,SQL Server Profiler是用于跟踪存储过程调用的强大工具。捕获的过程调用可能有助于发现问题。Profiler的大多数预定义模板都提供了与存储过程有关的事件。特别是, 如果我们仅需要捕获远程存储过程调用,则SQL Server Profiler的预定义的“ Tuning”模板可能非常有用。此外,列过滤器“ TextData”可用于按其名称(或名称的一部分)查找存储过程,并仅跟踪该过程的调用。因此,我们将能够仅跟踪特定存储过程的调用,并避免生成其他不必要的信息。

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1793040