【问题标题】:SQL Server : Insert triggerSQL Server:插入触发器
【发布时间】:2013-11-09 07:16:17
【问题描述】:

下面的触发器有问题。感谢您的帮助。

CREATE TRIGGER upper_case ON osoba
AFTER INSERT AS
BEGIN
    DECLARE @imie VARCHAR(25)
    DECLARE @new_imie VARCHAR(25)
    DECLARE my_cursor CURSOR FAST_FORWARD FOR SELECT imie FROM INSERTED

    OPEN my_cursor
    FETCH NEXT FROM my_cursor INTO @imie

    WHILE @@FETCH_STATUS = 0
        BEGIN
            @new_imie = UPPER(SUBSTRING(@imie, 1, 1)) + SUBSTRING(@imie, 2,LEN(@imie))
        END
        UPDATE osoba
        SET imie = @new_imie WHERE imie = @imie
END

错误信息:

消息 102,级别 15,状态 1,过程大写,第 13 行
“@new_imie”附近的语法不正确。
消息 102,级别 15,状态 1,过程 upper_case,第 17 行
'END' 附近的语法不正确。

【问题讨论】:

  • trigger 中使用 cursor 是您在 SQL Server 中可以做的最糟糕的事情。您应该不惜一切代价避免这种情况!触发器应该非常精简、非常高效,并且运行时间绝对最短.....
  • 你关闭并释放你的光标了吗?
  • 它应该做什么?它似乎没有做任何事情。
  • @RBarryYoung - 看起来它将每个更新的imie 的第一个字母大写。
  • @marc_s。在任何 dbms 中都不是一个聪明的主意...

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


【解决方案1】:

不要为此使用光标。

您可以使用UPDATE 语句同时影响所有行,而不是一一处理。

CREATE TRIGGER upper_case
ON osoba
AFTER INSERT
AS
  BEGIN
      UPDATE O
      SET    imie = UPPER(SUBSTRING(I.imie, 1, 1)) + SUBSTRING(I.imie, 2, LEN(I.imie))
      FROM   INSERTED I
             JOIN osoba O
               ON I.imie = O.imie
  END 

【讨论】:

  • 强调一下,触发器中的 DML 语句总是需要对任意数量的行(不仅仅是一个)起作用。
【解决方案2】:

分配@new_imiemsdn)时应使用SET

SET @new_imie = UPPER(SUBSTRING(@imie, 1, 1)) + SUBSTRING(@imie, 2,LEN(@imie));

【讨论】:

    【解决方案3】:

    您对@new_imie 的分配需要在它前面加上 SET 关键字...

       SET @new_imie = UPPER(SUBSTRING(@imie, 1, 1)) + SUBSTRING(@imie, 2,LEN(@imie))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多