AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 29635
Accepted
Warren  P
Warren P
Asked: 2012-12-01 12:37:41 +0800 CST2012-12-01 12:37:41 +0800 CST 2012-12-01 12:37:41 +0800 CST

在 SQL Server Profiler 中进行跟踪时,是否可以在过程调用中记录传入的参数值?

  • 772

使用 SQL Server Profiler(我在 SQL Server 2012 上),我试图生成一个有用的跟踪来显示参数值,而不仅仅是带有变量名的 SQL。存储过程遍历大量 Inventory 数据以生成一些非常有价值的结果,并且我正在尝试记录现有行为,因此我可以对其进行单元测试,准确定义它,然后将其重构为理智的东西。

我有一个执行 54 参数子过程的存储过程,在一个循环内,存储过程创建一个游标,然后执行一个 while 循环。这是一个简化的视图:

CREATE PROCEDURE 
   [dbo].[OuterProcedure]       
   (  @ProductCode varchar(8),          
     -- 41 more parameters omitted
   )
AS            
  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED   
  SET NOCOUNT ON           
 DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations.
 -- OMIT ABOUT 10 temporary table declarations.
 DECLARE  aCursor CURSOR FAST_FORWARD FOR         
   SELECT [ID],bkno,  -- about 40 fields omitted.
              FROM vwVeryComplexViewThatDoesALotOfVeryBrutalJoins         
              WHERE  (about_80_boolean_expressions AND omitted_here)
        ORDER BY some,keys,like,this

OPEN aCursor          
FETCH NEXT FROM aCursor /* Get First Record */         
    INTO @ID, @about_40_fields,.... 
WHILE (@@FETCH_STATUS = 0) AND         
          ( @About80MoreBooleanExpressionsHere)  
BEGIN   /* 1 */            
     -- about 700 lines of logic, math and if-parameter-this-then-that
     -- stuff omitted
            EXEC  @ConsiderItem = 
                      InnerProcedureCallWithinLoop
                                            @from_locn,        
                        @About53PARAMSOMITTED,
                                                ...

    FETCH NEXT FROM CurInventory /* Get Next Record */       
       INTO @ID,@MoreStuff,...    
END                   
CLOSE CurInventory          
DEALLOCATE CurInventory        

如何获得跟踪以显示传递给的所有参数值 InnerProcedureCallWithinLoop?有 54 个参数。我是否必须在我的 SQL 中编写“54 行 debug-printfs”,或者我可以在执行 SQL 跟踪时转储过程调用的所有参数值吗?

当我现在得到一个跟踪时,我得到这个输出:

EXEC  @ConsiderItem = InnerProcedureCallWithinLoop  @from_locn,        
                        @About53ParmsOmitted

我想知道的是,@from_locn = 1等等@About53ParmsOmitted = 'hello world'。

这并没有告诉我参数的实际值@from_locn。在第一个参数的情况下,它被传递到我的顶级存储过程,所以我知道它是 0 或 1,视情况而定。然而,该内部过程中的 43 个参数中约有 40 个来自循环FETCH NEXT FROM aCursor内的操作。WHILE

现在跟踪告诉我调用了多少次InnerProcedureCallWithinLoop,每个调用了多长时间,但不是该调用的参数值是什么。如果我能以某种方式获得“可运行的独立 SQL 脚本”来复制我在代码中找到的一些极端情况,同时跟踪这些脚本,设置这些粗略的函数(我知道,54 个参数,这真的很粗略,但我没有写他们!)可能需要我一个小时的打字才能构建一个 SQL 脚本,让我自己调用这个极端情况,在这个庞大的 SQL Server 存储过程之外。

这是深入研究 SQL 表达式并构建可以探测这些复杂存储过程的脚本的全部努力的一部分。

更新我找到了 RPC“输出参数”记录选项,但没有找到“RPC IN PARAM”记录选项。

sql-server stored-procedures
  • 1 1 个回答
  • 4499 Views

1 个回答

  • Voted
  1. Best Answer
    孔夫子
    2012-12-02T01:49:18+08:002012-12-02T01:49:18+08:00

    我硬着头皮告诉你,这样的痕迹是不能设置的,因为这不是痕迹的[感知]目的。我一直这样做:

    WHILE (@@FETCH_STATUS = 0) AND
                (@About80MoreBooleanExpressionsHere)
    BEGIN /* 1 */
        -- 大约 700 行逻辑、数学和 if-parameter-this-then-that
        -- 省略的东西
          INSERT InnerProcedureCallWithinLoop__TraceTable
                  VALUES (@from_locn, @ About53PARAMSOMITTED

          EXEC @ConsiderItem =
                InnerProcedureCallWithinLoop
                      @from_locn,
                            @About53PARAMSOMITTED,
    ...

    如果我知道它只能从一个位置调用。否则,我在被调用者而不是调用者中执行此操作。

    ALTER PROC InnerProcedureCallWithinLoop
        @from_locn int,
        @About53PARAMSOMITTED ...
    AS
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    SET NOCOUNT ON;
    INSERT InnerProcedureCallWithinLoop__TraceTable VALUES (@from_locn, @prm2, @prm3....
    --- rest of proc
    

    这显然与使用跟踪不同,后者能够捕获事件,即使它们开始但从未完成(错误参数、回滚事务)。如果这是您的问题,您需要查看 CLR 或电子邮件方法来外部化捕获的输出。

    • 8

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve