使用where

时间:2018-08-23 12:04:43

标签: sql sql-server tsql sql-server-2008

我有一个简单的日志记录脚本,该脚本会从触发器中填充变更日志表,我试图通过排除某些模式(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子句从触发器中的插入内容中删除这些内容。

1 个答案:

答案 0 :(得分:1)

由于这似乎是程序代码,因此您可以简单地使用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;
...