这是我的第一个问题。我是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的所有行。
我试着找出为什么它现在几个小时都没有工作......
我/我的错误在哪里?
祝你好运
汤姆
答案 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}}表加入表,才能更新插入的行。