SQL Server:if语句,用于检查列是否已被修改

时间:2016-08-09 21:57:41

标签: sql sql-server triggers

我有一个包含3列FirstNameLastNameFullName的表格(不要问为什么)。我想创建一个SQL Server触发器,以便在修改两列中的一列时更新FullName。如何检查列是否已更新?或者除了撕掉它之外,还有更好的替代方案吗?它正在整个应用程序的许多地方使用

CREATE TRIGGER tr_UPDATE_FULLNAME 
ON [dbo].[Person]
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF UPDATE (FirstName) // not sure if this is correct
    BEGIN
         declare @fName nvarchar(50), @lName nvarchar(50)
         select @fName = FirstName from inserted
         select @lName = LastName from inserted

        UPDATE [dbo].[Person]

        SET FullName = @fName + ' ' + @lName
        WHERE FirstName = @fName and LastName = @lName
    END 
END

4 个答案:

答案 0 :(得分:4)

根本不需要触发器。 Computed column非常适合您的目的。

因为FullName列在同一个表中,所以使用计算列会更简单。

ALTER TABLE [dbo].[Person] 
    ADD FullName AS (COALESCE(@FirstName + ' ' + @LastName, @FirstName , @LastName, ''));

Computed Columns

如果名为FullName的列已存在,则需要在创建计算列之前删除它。

ALTER TABLE [dbo].[Person] DROP COLUMN FullName;

答案 1 :(得分:0)

正确方式是使用基于集合的方法,考虑到可能会针对更新多个语句触发触发器一次划一次并相应地处理这种情况:

CREATE TRIGGER [dbo].[tr_UPDATE_FULLNAME] 
ON [dbo].[Person]
AFTER UPDATE
AS 
BEGIN
    UPDATE [dbo].[Person]
    SET FullName = COALESCE(@fName + ' ' + @lName, @fName, @lName, '')
    FROM Inserted i
    INNER JOIN Deleted d ON i.PrimaryKeyColumn = d.PrimaryKeyColumn
    WHERE i.PrimaryKeyColumn = dbo.Person.PrimaryKeyColumn
      AND (i.FirstName <> d.FirstName OR i.LastName <> d.LastName)
END

到目前为止,所有其他提议的解决方案都有可怕的假设Inserted只包含单行 - 这是不保证并且会导致语句像这样

select @fName = FirstName from inserted

只需从Inserted表中选择一个任意行,然后忽略可能存在的所有其他行(并且也已更新)

答案 2 :(得分:-1)

如果你的表只有三列,那么,我相信这是你最想要的(除非你的名字上有一些额外的唯一性条件)。

ALTER TRIGGER tr_UPDATE_FULLNAME
ON dbo.Person
AFTER UPDATE
AS
BEGIN
    IF @@ROWCOUNT = 0 RETURN;
    SET NOCOUNT ON;
    UPDATE dbo.Person
    SET FullName=FirstName + ' ' + LastName;
END;

答案 3 :(得分:-1)

感谢大家的帮助,我想我会通过创建视图来采用Hogans方法。这是存储过程的样子

create TRIGGER [dbo].[tr_UPDATE_FULLNAME] ON [dbo].[Person]
   AFTER UPDATE
AS BEGIN

    IF (UPDATE (FirstName) OR UPDATE (LastName))
    BEGIN
         declare @fName nvarchar(50), @lName nvarchar(50)
         select @fName = FirstName from inserted
         select @lName = LastName from inserted

        UPDATE [dbo].[Person]
        SET FullName = COALESCE(@fName + ' ' +@lName,@fName,@lName,'')
        WHERE FirstName = @fName and LastName = @lName
    END 
END