【问题标题】:SQL Update trigger comparing NULL with valueSQL 更新触发器将 NULL 与值进行比较
【发布时间】:2014-01-08 01:50:25
【问题描述】:

我正在尝试在表上创建更新触发器。目的是保留对该表所做更改的审计跟踪。 代码比较长,这里尽量简化一下:

当 tbl1 发生更新时:

@NewFirstName = FirstName
@NewLastName = LastName

从插入

@OldFistName = FirstName
@OldLastName = LastName

来自已删除

现在我想创建一个字符串来告诉用户这样的事情: ID1 已从 John 更改为 Michael

这是我的代码

if (@OldFistName <> @NewFirstName )          
set @AuditString = @AuditString + ' NewFirstName from ' + cast(@OldFistName as varchar)  + '  to  ' +  cast (@NewFirstName as varchar)  + ','

我面临的问题是数据库中的许多字段都有 NULLS。因此,例如,如果 FistName 为 NULL,则代码将无法工作,因为它将 NULL 与某些东西进行比较,这给了我 null。

有没有办法解决这个问题?

我使用的是 SQL Server 2008

【问题讨论】:

    标签: sql sql-server sql-server-2008 triggers sql-update


    【解决方案1】:

    是的,有一个简单的解决方法。只需检查您的if 条件变量是否为空。代码如下所示:

    if @OOldFistName is null
      -- Your code to handle this
    else if @NewFirstName is null
      -- Your code to handle this
    else if (@OldFistName <> @NewFirstName )
    set @AuditString = @AuditString + ' NewFirstName from '
                       + cast(@OldFistName as varchar) + ' to '
                       + cast (@NewFirstName as varchar) + ','
    

    【讨论】:

    • 我想过,但它不会起作用,因为我不想对所有的 NULL 做任何事情。我只希望形成的字符串是 NULL 并且值已更改。我刚刚想出了如何做到这一点。
    【解决方案2】:

    刚刚想出了如何做到这一点,添加AND条件

    if   (@OldFistName is null AND @NewFirstName IS NOT NULL )
      set @AuditString = @AuditString + ' FistName from ' + 'NULL '  + '  to  ' +  cast (@NewFirstName as varchar)  + ','
      ELSE
      if (@OldFistName <> @NewFirstName )          
      set @AuditString = @AuditString + ' NewFirstName from ' + cast(@OldFistName as varchar)  + '  to  ' +  cast (@NewFirstName as varchar)  + ','  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2013-05-04
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多