我正在使用扩展事件来跟踪我们的应用程序使用的语句。我创建了一个会话来收集我想要的信息,除了我还想知道所使用参数的实际值。
我在非生产环境中执行此跟踪,跟踪影响的任何性能都是可以接受的。
所有查询都源自 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 命令(包括所有参数值)。对于其他情况,如果可能,知道如何捕获参数值仍然很好。
在 SQL Server 2008 上运行此代码段会产生与在 SQL Server 2014 上不同的结果。我需要它们产生相同的结果。
我的场景是我正在编写单元测试(使用 tsqlt),而这段代码是我试图测试的一个巨大过程的一部分。在我的测试代码中,我可以做任何事情,因为该代码永远不会投入生产。这个“错误”在生产中不会造成损害,但在编写测试时给我带来了问题。意思是,我不想更改代码,只想更改测试。
我的本地开发环境是 SQL Server 2014,但我们的一些 CI 环境仍然是 SQL Server 2008。
我目前的技巧是在服务器是 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)