首页 > 解决方案 > 使用 where 将 EventData 插入 SQL 表

问题描述

我有一个简单的日志记录脚本,它从触发器填充更改日志表,我试图通过排除特定模式(chi)的插入来限制插入的行

扳机:

 DECLARE @data XML
 SET @data = EVENTDATA()

 INSERT INTO [dbo].[Object_ChangeLog](databasename, eventtype, objectname, objecttype, sqlcommand, loginname)
 VALUES (@data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'),
         @data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)'), 
         @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'), 
         @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)'), 
         @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)'), 
         @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)'))

而且我需要使用 where 子句来过滤模式名称 (chi) 下的对象更改 - 到目前为止我已经尝试过:

WHERE 
    @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)') NOT LIKE 'chi%'

不幸的是,这会产生语法错误,有两个问题,首先我需要从事件数据中引入一个单独的列来识别架构吗?其次,我如何利用 where 子句从触发器中的插入中删除这些。

标签: sqlsql-servertsqlsql-server-2008

解决方案


由于这似乎是程序代码,您可以简单地使用IF.

...
IF @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)') NOT LIKE 'chi%'
BEGIN
  INSERT INTO [dbo].[Object_ChangeLog](databasename, eventtype, 
  objectname, objecttype, sqlcommand, loginname)
  VALUES(
  @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'),
  @data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)'), 
  @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'), 
  @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)'), 
  @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)'), 
  @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)')
  );
END;
...

推荐阅读