4

我在 SQL Server 上使用 HeidiSQL,试图创建一个插入后触发器,这里是代码。

CREATE TRIGGER TR_After_Insert_User ON User1 AFTER INSERT
AS
BEGIN
    declare @userName varchar(24)
    declare @userLName varchar(20)
    declare @userSex varchar(10)

    select @userName = i.name from inserted i
    select @user1LName = i.lastname from inserted i
    select @userSex = i.gender from inserted i

    IF @userSex = 'Male'
       @userSex = 'M'
    ELSE
        @userSex = 'F'

    INSERT INTO db2.dbo.user2(name, lastname, gender) 
    VALUES (@legajoName, @legajoName, @legajoSexo)
END

我得到的错误:

'@userSex' 附近的语法不正确

我在没有 IF 语句的情况下尝试过它,它起作用了,所以问题就在那里。但我需要那句话,因为第二个表中的“性别”字段是“字符”类型。

4

2 回答 2

6

你错过了SET

IF @userSex = 'Male'
   SET @userSex = 'M'
ELSE
   SET @userSex = 'F'

在 SQL 中,这是为变量赋值的无效语法:@userSex = 'M'.

参考

设置@local_variable

将先前使用 DECLARE @local_variable 语句创建的指定局部变量设置为给定值。

SET { { @local_variable = 表达式 }

于 2015-09-18T14:54:28.383 回答
2

你的触发器有一个重大的逻辑缺陷。它假设只会插入一行。这是一个常见但主要的问题。在 sql server 触发器中,每个操作触发一次,而不是每行触发一次。您可以将整个触发器更改为基于单个集合的插入并删除所有这些标量变量。

CREATE TRIGGER TR_After_Insert_User ON User1 AFTER INSERT
AS
BEGIN
    INSERT INTO db2.dbo.user2(name,lastname,gender) 
    select name, lastname, left(gender, 1) --or you could use a case expression here
    from inserted
END
于 2015-09-18T15:14:31.840 回答