【问题标题】:Delete query not working in stored procedure删除查询在存储过程中不起作用
【发布时间】:2021-10-12 21:59:02
【问题描述】:

我在 sql server 中有一个存储过程,第一步将一些数据从一个表插入到另一个表中,然后从第一个表中删除插入到第二个表中的数据;可能描述比较复杂,看代码吧:

ALTER PROCEDURE [dbo].[SP_Insert_NotificationUserBulk]
AS
BEGIN
  SET NOCOUNT ON;
  INSERT INTO [dbo].[NotificationUserBulk]
       ([NotificationId]
       ,[UserId]
       ,[IsNotify]
       ,[IsShow]
       ,[NotifyMethod]
       ,[NotifyDateTime]
       ,[ShowDateTime]
       ,[IsDeleted]
       ,[CreatedDate]
       ,[ModifiedDate])
 
 (SELECT 
UserId,
NotificationId,
IsNotify,
IsShow,
NotifyMethod,
NotifyDateTime,
ShowDateTime,
IsDeleted,
CreatedDate,ModifiedDate
FROM NotificationUsers WHERE IsShow=1 OR IsDeleted=1)

DELETE FROM dbo.NotificationUsers WHERE IsShow=1 OR IsDeleted=1
   RETURN
END

Insert 语句执行成功,没有问题,但在 Delete 语句中不起作用,没有任何反应。 那么问题出在哪里,我该如何解决呢?

【问题讨论】:

  • 这是我的错,我解决了。谢谢,但它与此无关,它在存储过程之外成功执行
  • 不考虑为什么您的删除不起作用 - 这些应该在事务上保持一致并且应该在 begin/end transaction 内。您也可以使用output 在单个语句中执行此操作。此外,在您的架构前缀中保持一致 - 始终使用 dbo 或不使用,否则您可能会产生歧义。
  • 还有single statement option,因为SQL Server支持delete TableA output ... into TableB
  • @AlwaysLearning 谢谢,成功了!

标签: sql sql-server stored-procedures


【解决方案1】:

如果这是一次性或临时查询,您可以尝试类似的方法。如果是 oltp,那么您可以添加 TRY/CATCH 并返回成功/失败变量。

在与XACT_ABORT ON 的显式事务中,查询插入到“NotificationUsers”表中,将(插入的)NotificationId 输出到临时表中,并根据带有临时表的INNER JOIN 从“NotificationUsers”中删除。

ALTER PROCEDURE [dbo].[SP_Insert_NotificationUserBulk]
AS
SET NOCOUNT ON;
SET xact_abort on;

begin transaction 
    declare @NotificationId             table(NotificationId        int primary key);

    INSERT INTO [dbo].[NotificationUserBulk]
           ([NotificationId]
           ,[UserId]
           ,[IsNotify]
           ,[IsShow]
           ,[NotifyMethod]
           ,[NotifyDateTime]
           ,[ShowDateTime]
           ,[IsDeleted]
           ,[CreatedDate]
           ,[ModifiedDate])
    output inserted.NotificationId into @NotificationId 
    SELECT UserId, NotificationId, IsNotify, IsShow, NotifyMethod,
           NotifyDateTime, ShowDateTime, IsDeleted, CreatedDate, 
           ModifiedDate
    FROM NotificationUsers
    WHERE IsShow=1 
          OR IsDeleted=1;

    DELETE nu
    from dbo.NotificationUsers nu
         join @NotificationId n on nu.NotificationId=n.NotificationId;
commit
go

【讨论】:

  • 我做了这样的事情,现在sp执行成功了。
【解决方案2】:

DELETE查询后请不要使用RETURN,尽量简单查询

DELETE FROM dbo.NotificationUsers WHERE IsShow=1 OR IsDeleted=1

【讨论】:

  • 感谢您的反馈,但这不是解决方案
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多