小编Pet*_*ell的帖子

从扩展事件会话收集参数值

我正在使用扩展事件来跟踪我们的应用程序使用的语句。我创建了一个会话来收集我想要的信息,除了我还想知道所使用参数实际值

我在非生产环境中执行此跟踪,跟踪影响的任何性能都是可以接受的。

所有查询都源自 Hibernate,并以以下形式参数化:

SELECT a, b, c From Customer where CustomerId = @P0
Run Code Online (Sandbox Code Playgroud)

这是我的会话设置。

CREATE EVENT SESSION [TracingForStatements] ON SERVER 
ADD EVENT sqlserver.sp_statement_completed ( 
    ACTION (    
        sqlserver.session_id,
        package0.collect_system_time,
        sqlserver.transaction_id,
        package0.event_sequence
    ) 
    WHERE ( 
        sqlserver.database_id=555
    ) 
) 
ADD TARGET package0.ring_buffer(SET max_memory= 128000)
WITH (EVENT_RETENTION_MODE = NO_EVENT_LOSS, 
      MAX_DISPATCH_LATENCY = 1 SECONDS)
Run Code Online (Sandbox Code Playgroud)

如何捕获捕获语句中使用的参数的实际值?是否可以?

--编辑(解决方法):将事件更改为 rpc_completed 为我提供了从 Hibernate 调用的完整 sql 命令(包括所有参数值)。对于其他情况,如果可能,知道如何捕获参数值仍然很好。

extended-events sql-server-2012

10
推荐指数
1
解决办法
3972
查看次数

使用 IDENTITY_INSERT 时身份种子增加

在 SQL Server 2008 上运行此代码段会产生与在 SQL Server 2014 上不同的结果。我需要它们产生相同的结果。

我的场景是我正在编写单元测试(使用 tsqlt),而这段代码是我试图测试的一个巨大过程的一部分。在我的测试代码中,我可以做任何事情,因为该代码永远不会投入生产。这个“错误”在生产中不会造成损害,但在编写测试时给我带来了问题。意思是,我不想更改代码,只想更改测试。

我的本地开发环境是 SQL Server 2014,但我们的一些 CI 环境仍然是 SQL Server 2008。

  • 我的第一个问题是是否有任何方法可以避免 2008 年出现此(错误)?
  • 我的第二个问题是,是否有任何方法可以使 2014 年的行为与 2008 年相同,从而使测试在 2008 年和 2014 年都通过。任何设置或跟踪标志或黑客?

我目前的技巧是在服务器是 2008 的情况下将表重新设置为 0(而不是 1)。我不喜欢这样,因为当我们的环境升级时我需要更改它或删除它。

IF CHARINDEX('2008', @@VERSION) > 0 BEGIN
        -- HACK to fix identity bug in SQL 2008.
        DBCC CHECKIDENT('...peter', RESEED, 0);
END
Run Code Online (Sandbox Code Playgroud)

麻烦的代码:

IF OBJECT_ID('tempdb..#peter') IS NOT NULL DROP TABLE #peter;
CREATE TABLE #peter(ID INT IDENTITY(1, 1), VALUE CHAR(10));

SET IDENTITY_INSERT #peter ON;
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

sql-server identity

1
推荐指数
1
解决办法
1566
查看次数