我无法在SQL中更新多个记录

时间:2015-03-30 07:22:03

标签: sql sql-server

所以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

3 个答案:

答案 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