在SQL Server中插入后触发更改数据

时间:2015-01-30 11:43:34

标签: sql-server triggers

这是我的第一个问题。我是DML的绝对初学者。

目的是为web ui中的后续下拉框实现层次结构。 原始代码用于oracle,我尝试将其转换为SQL Server。在Oracle中,他们用"在插入"之前解决了它。和#34;每行"。

到目前为止,这是我的代码:

CREATE TRIGGER dbo.test
ON  dbo.TOPOLOGY
AFTER INSERT
AS
BEGIN
    IF @@ROWCOUNT = 0
        RETURN

    SET NOCOUNT ON

    IF INSERTED.HIERARCHY_LEVEL = 0
    BEGIN
        SET INSERTED.L0 = INSERTED.TOPOLOGY_ID
        SET INSERTED.PARENT = NULL
    END
    ELSE
       IF INSERTED.HIERARCHY_LEVEL = 1
       BEGIN
           SET INSERTED.L1 = INSERTED.TOPOLOGY_ID
           SET INSERTED.PARENT = INSERTED.L0
       END
       ELSE
           IF INSERTED.HIERARCHY_LEVEL = 2
           BEGIN
               SET INSERTED.L2 = INSERTED.TOPOLOGY_ID
               SET INSERTED.PARENT = INSERTED.L1
           END
           ELSE
               IF INSERTED.HIERARCHY_LEVEL = 3
               BEGIN
                   SET INSERTED.L3 = INSERTED.TOPOLOGY_ID
                   SET INSERTED.PARENT = INSERTED.L2
               END
               ELSE
                   IF INSERTED.HIERARCHY_LEVEL = 4
                   BEGIN
                       SET INSERTED.L4 = INSERTED.TOPOLOGY_ID
                       SET INSERTED.PARENT = INSERTED.L3
                   END
END

数据库会丢弃错误消息:语法错误接近'。'对于包含INSERTED.Lx的所有行。

我试着找出为什么它现在几个小时都没有工作......

我/我的错误在哪里?

祝你好运

汤姆

1 个答案:

答案 0 :(得分:1)

您必须更新您的表而不是INSERTED表。试试这种方法:

UPDATE T
SET T.L0     = CASE T.HIERARCHY_LEVEL WHEN 0 THEN T.TOPOLOGY_ID ELSE T.L0       END
   ,T.L1     = CASE T.HIERARCHY_LEVEL WHEN 1 THEN T.TOPOLOGY_ID ELSE T.L1       END
   ,T.L2     = CASE T.HIERARCHY_LEVEL WHEN 2 THEN T.TOPOLOGY_ID ELSE T.L2       END
   ,T.L3     = CASE T.HIERARCHY_LEVEL WHEN 3 THEN T.TOPOLOGY_ID ELSE T.L3       END
   ,T.L4     = CASE T.HIERARCHY_LEVEL WHEN 4 THEN T.TOPOLOGY_ID ELSE T.L4       END
   ,T.PARENT = CASE T.HIERARCHY_LEVEL WHEN 0 THEN NULL                  
                                      WHEN 1 THEN T.L0          
                                      WHEN 2 THEN T.L1          
                                      WHEN 3 THEN T.L2
                                      WHEN 4 THEN T.L2          ELSE T.PARENT   END
FROM TOPOLOGY AS T
INNER JOIN INSERTED AS I
    ON T.KEY = I.KEY -- Your Primary Key

由于INSERTED是一个表格,因此您无法像使用IF一样使用INSERTED。您必须使用{{1}}表加入表,才能更新插入的行。