所以sql代码如下所示:
UPDATE
tbl1
SET
LastModifiedDate = GETDATE(),
col1 = 'Closed',
LastModifiedBy = 'usr'
WHERE
col2 = 'xxx'
AND
col1 NOT LIKE '%Closed%'
AND
DATEDIFF(day, DateTimeOfInsert, GETDATE()) > 30
AND
col3 NOT IN
(SELECT
col3
FROM
tbl1
WHERE
col2 = 'xxx'
AND
DATEDIFF(day, DateTimeOfInsert, GETDATE()) < 30)
基本上我想关闭col1为&x; xxx&#39;的所有记录,这些记录尚未关闭且超过30天并且在过去30天内没有类似记录。 这就是我得到的:
子查询返回的值超过1。这是不允许的 子查询跟随=,!=,&lt;,&lt; =,&gt;,&gt; =或当子查询用作 一种表达。声明已经终止。
我真的相信这个触发器导致了这个问题:
CREATE TRIGGER trg_tbl1_closeAction
ON tbl1
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
If (SELECT col1 FROM INSERTED) NOT LIKE '%Close%'
Begin
Return
End
INSERT INTO tbl2
(tbl_1_ID, col4, usr)
select i.ID, '10', tu.id
from inserted i
LEFT OUTER JOIN tbl3 tu ON tu.usr=i.LastModifiedBy;
END
答案 0 :(得分:4)
你所展示的触发器确实被打破了。像这样:
CREATE TRIGGER trg_tbl1_closeAction
ON tbl1
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
INSERT INTO tbl2
(tbl_1_ID, col4, usr)
select i.ID, '10', tu.id
from inserted i
LEFT OUTER JOIN tbl3 tu ON tu.usr=i.LastModifiedBy
WHERE i.col1 LIKE '%Close%';
END
可能是预期的(因为inserted
可以包含多行,某些可能类似于Close
而其他也没有 - 所以我们将过滤器移动到WHERE
条款)。
答案 1 :(得分:0)
Datediff是一个子查询。在您的情况下,它可能返回多个值(多个记录)。此外,它可能每天返回一个值或者你有DateTimeOfInsert(当然,两者都是,我对你的模式不熟悉)。
如错误所述,您无法使用&#39;&lt;&#39;在返回多个值的子查询上。
答案 2 :(得分:0)
问题在于:
If (SELECT col1 FROM INSERTED) NOT LIKE '%Close%'
多次更新时, SELECT col1 FROM INSERTED
在此处返回多于1行。如果更新数据包只应以closed
方式更新为状态all or none
,则:
ALTER TRIGGER trg_tbl1_closeAction ON tbl1
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
IF EXISTS ( SELECT *
FROM INSERTED
WHERE col1 NOT LIKE '%Close%' )
BEGIN
RETURN
END
INSERT INTO tbl2
( tbl_1_ID ,
col4 ,
usr
)
SELECT i.ID ,
'10' ,
tu.id
FROM inserted i
LEFT OUTER JOIN tbl3 tu ON tu.usr = i.LastModifiedBy;
END