从DBCC INPUTBUFFER获取参数值

时间:2017-06-23 19:29:45

标签: sql-server

我在SQL Server 2012表上创建了一个触发器,将针对该表的所有INSERT,UPDATE和DELETE操作记录到另一个表中。我从http://sqlblog.com/blogs/jonathan_kehayias/archive/2010/01/11/tsql2sday-using-sys-dm-exec-sql-text-to-get-the-calling-statement.aspx的博客文章中获取了我的初始代码。

以下是测试表的脚本,我在测试表上记录更改的表,以及测试表上的触发器:

CREATE TABLE [dbo].[TestAddresses](
    [RecNo] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [varchar](50) NULL,
    [LastName] [varchar](50) NULL,
    [Address] [varchar](50) NULL,
    [City] [varchar](50) NULL,
    [State] [varchar](2) NULL,
    [Zip] [varchar](12) NULL
) ON [PRIMARY]

GO
-------------------------------------
CREATE TABLE [dbo].[TestAddressesLog](
    [RecNo] [int] IDENTITY(1,1) NOT NULL,
    [Sql] [nvarchar](max) NULL,
    [Timestamp] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[TestAddressesLog] ADD  CONSTRAINT [DF_TestAddressesLog_Sql]  DEFAULT (N'') FOR [Sql]
GO

ALTER TABLE [dbo].[TestAddressesLog] ADD  CONSTRAINT [DF_TestAddressesLog_Timestamp]  DEFAULT (getdate()) FOR [Timestamp]
GO
------------------------------------
ALTER TRIGGER [dbo].[TestAddressLogTrigger]
   ON  [dbo].[TestAddresses]
   FOR INSERT, UPDATE, DELETE 
AS 
BEGIN 

   DECLARE @TEMP TABLE  (EventType NVARCHAR(30), Parameters INT, EventInfo NVARCHAR(4000)) 
   INSERT INTO @TEMP EXEC('DBCC INPUTBUFFER(@@SPID)') 

   INSERT INTO TestAddressesLog (Sql) 
        SELECT EventInfo FROM @TEMP 
END 

这对于没有参数的标准CRUD操作非常有用。但是,当我的.NET代码执行参数化操作时,如下所示(将某个值如'CA'赋值给@NewState):

UPDATE TestAddresses SET State = @NewState WHERE State = 'TX'

我得到以下结果:

(@NewState int)UPDATE TestAddresses SET State = @NewState WHERE State = 'TX'

我需要一种获取和记录传递参数值的方法。有人有解决方案吗?

1 个答案:

答案 0 :(得分:0)

那不行。唯一的方法是使用扩展事件捕获RPC已完成事件,解析它们并保留它们。