【问题标题】:Delete multiple rows by sql statement "delete from tableName" whereas TRIGGER "After Delete" had applied on that通过sql语句“从tableName删除”删除多行,而TRIGGER“删除后”已应用于该行
【发布时间】:2013-07-25 11:09:48
【问题描述】:

我在一张表上应用了“删除后”触发器,下面是脚本:

ALTER TRIGGER [dbo].[onDelete_N_UR]
   ON  [dbo].[Notification_UnRead]
   AFTER delete
AS 
BEGIN


SET NOCOUNT ON;

declare @roid int 
set @roid=(select ReachOutID from deleted(nolock) 
where  deleted.NotificaionType='reachoutlike')


update CACHE_Reachout 
set CACHE_Reachout.LIKEcount=(select [dbo].[getReachout_Notification_Count](@roid,'like') ) 
where CACHE_Reachout.ReachOutID=@roid

结束

现在我正在尝试使用以下 sql 语句批量删除一些行:

delete from  Notification_UnRead where Notification_ID=****

它给了我错误

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."

当应用删除触发器时,如何使用上述删除语句删除多行。

【问题讨论】:

  • 那个错误信息非常明确。
  • 您的删除查询似乎没有使用子查询,除非那些 **** 转换为子查询而不是静态值。您需要在此处发布触发器的完整 SQL 以获得任何帮助。

标签: sql-server triggers sql-delete


【解决方案1】:

试试这个 -

ALTER TRIGGER [dbo].[onDelete_N_UR]
  ON [dbo].[Notification_UnRead]
  AFTER DELETE
AS BEGIN


     SET NOCOUNT ON;

     DECLARE @roid INT
     SET @roid =
     (
          SELECT TOP 1 ReachOutID
          FROM DELETED d
          WHERE d.NotificaionType = 'reachoutlike'
     )


     UPDATE CACHE_Reachout
     SET CACHE_Reachout.LIKEcount = dbo.getReachout_Notification_Count(@roid, 'like')
     WHERE CACHE_Reachout.ReachOutID = @roid

END

或者试试这个(更适合使用)-

ALTER TRIGGER [dbo].[onDelete_N_UR]
  ON [dbo].[Notification_UnRead]
  AFTER DELETE
AS BEGIN

     SET NOCOUNT ON;

     UPDATE t
     SET LIKEcount = dbo.getReachout_Notification_Count(d.ReachOutID, 'like')
     FROM CACHE_Reachout t
     JOIN DELETED d ON t.ReachOutID = d.ReachOutID
     WHERE d.NotificaionType = 'reachoutlike'

END

【讨论】:

    【解决方案2】:

    要么

    set @roid=(select ReachOutID from deleted(nolock) 
    where  deleted.NotificaionType='reachoutlike')
    

    或者

        set CACHE_Reachout.LIKEcount=
        (select [dbo].[getReachout_Notification_Count](@roid,'like') ) 
        where CACHE_Reachout.ReachOutID=@roid
    

    正在返回多于 1 行的数据。

    拉吉

    【讨论】:

      【解决方案3】:
      ALTER TRIGGER [dbo].[onDelete_N_UR]
      ON [dbo].[Notification_UnRead]
      AFTER DELETE
      AS
      BEGIN
      
           SET NOCOUNT ON;
      
           DECLARE @roid INT
           SET @roid =
           (
                SELECT TOP 1 ReachOutID
                FROM DELETED(nolock)
                WHERE DELETED.NotificaionType = 'reachoutlike'
           )
      
      
           UPDATE CACHE_Reachout
           SET CACHE_Reachout.LIKEcount =
           (
                SELECT [dbo].[getReachout_Notification_Count](@roid, 'like')
           )
           WHERE CACHE_Reachout.ReachOutID = @roid
      
      END
      

      【讨论】:

      • 虽然这会消除错误,但它并不能解决逻辑问题(除非具有相同Notification_ID 的每一行都具有相同的ReachOutID) - 您正在选择一个任意 ReachOutID 来自deleted,并忽略所有其他也被删除的内容。您需要编写代码,尊重 deleted 是一个包含 多个 行的伪表。
      【解决方案4】:
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      
      ALTER TRIGGER [dbo].[onDelete_N_UR]
         ON  [dbo].[Notification_UnRead]
         AFTER delete
      AS 
      BEGIN
      
      
          SET NOCOUNT ON;
      
          declare @roid int 
      
          CREATE TABLE #TempTable (ReachOutID INT)
      
          INSERT INTO #TempTable (ReachOutID)
          select ReachOutID from deleted(nolock) where deleted.NotificaionType='reachoutlike'
      
      
      
      
      DECLARE @getAccountID CURSOR
      SET @getAccountID = CURSOR FOR
      SELECT ReachOutID
      FROM #TempTable
      OPEN @getAccountID
      FETCH NEXT
      FROM @getAccountID INTO @roid
      WHILE @@FETCH_STATUS = 0
      BEGIN
      
      update CACHE_Reachout set CACHE_Reachout.LIKEcount=(select [dbo].[getReachout_Notification_Count](@roid,'like') ) where CACHE_Reachout.ReachOutID=@roid
      
      
      
      FETCH NEXT
      FROM @getAccountID INTO @roid
      END
      CLOSE @getAccountID
      DEALLOCATE @getAccountID
      
          drop table #TempTable
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2021-02-25
        相关资源
        最近更新 更多