如何编写存储过程以接受使用IN操作删除行的集合?

bas*_*ash 2 sql sql-server stored-procedures

我正在尝试为删除编写存储过程。但是为了提高性能,我们已将delete sql查询更改为使用IN操作。我要编写接受逗号分隔ID的过程。

我尝试编写一个接受单个条目ID的过程。步骤如下。

CREATE PROCEDURE DeleteListEntry
        @entryid int

AS

DELETE FROM  LIST_ITEMS
 WHERE ENTRY_ID = @entryid;
go
Run Code Online (Sandbox Code Playgroud)

我想知道如何将上述过程转换为接受批量输入。它的SQL查询如下-

DELETE FROM LIST_ITEMS WHERE ENTRY_ID IN (id1, id2, id2, ... );
Run Code Online (Sandbox Code Playgroud)

Lar*_*rnu 5

一种方法是使用Table类型参数,而使用JOIN假设 ENTRY_IDint

CREATE TYPE dbo.EntryList AS TABLE (Entry_ID int NOT NULL);
GO

CREATE PROC dbo.DeleteListEntry @Entries dbo.EntryList READONLY AS
BEGIN

    DELETE LI
    FROM LIST_ITEMS LI
         JOIN @Entries E ON LI.ENTRY_ID = E.Entry_ID ;
END;
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式调用SP:

DECLARE @Entries dbo.EntryList;
INSERT INTO @Entries
VALUES(1),(2),(3);

EXEC dbo.DeleteListEntry @Entries;
Run Code Online (Sandbox Code Playgroud)

  • 我猜是因为您回答了一个重复的问题。答案是否完美无所谓,人们只是为不“遵循规则”而投票 (3认同)
  • 有趣的是,投了反对票。任何原因?如果这是原因,我已经解决了别名问题。如果没有,请分享您的原因,以便我改善答案。我们不了解我们是否知道自己“做错了”。 (2认同)
  • 就个人而言,我不介意投票,但我将其视为学习的机会。不幸的是,如果选民不发表评论,我和提出问题的OP都不会学到任何东西。感到羞耻,但这至少可以回答OP的问题。我实际上不同意这里的链接重复,因此我将添加更多内容,因为它使用的是“ WHILE”。我将在对此问题下添加评论。 (2认同)