Sql 如何编写存储过程来接受集合以删除在操作中使用的行?
我正在尝试编写用于删除的存储过程。但是为了提高性能,我们将deletesql查询更改为在操作中使用Sql 如何编写存储过程来接受集合以删除在操作中使用的行?,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在尝试编写用于删除的存储过程。但是为了提高性能,我们将deletesql查询更改为在操作中使用。我想写一个接受逗号分隔ID的过程 我试着写一个程序,它接受单个条目ID。该程序如下所示 CREATE PROCEDURE DeleteListEntry @entryid int AS DELETE FROM LIST_ITEMS WHERE ENTRY_ID = @entryid; go 我想知道如何将上述过程转换为接受批量输入。它的sql查询如下所示- DELETE
。我想写一个接受逗号分隔ID的过程
我试着写一个程序,它接受单个条目ID。该程序如下所示
CREATE PROCEDURE DeleteListEntry
@entryid int
AS
DELETE FROM LIST_ITEMS
WHERE ENTRY_ID = @entryid;
go
我想知道如何将上述过程转换为接受批量输入。它的sql查询如下所示-
DELETE FROM LIST_ITEMS WHERE ENTRY_ID IN (id1, id2, id2, ... );
一种方法是使用表类型参数和JOIN
。假设ENTRY\u ID
是int
:
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;
然后,您可以通过执行以下操作调用SP:
DECLARE @Entries dbo.EntryList;
INSERT INTO @Entries
VALUES(1),(2),(3);
EXEC dbo.DeleteListEntry @Entries;
有趣的是,投了反对票。有什么原因吗?我已经解决了别名问题,如果这是原因的话。如果没有,请分享你的理由,以便我可以改进答案。如果我们不知道自己“做错了什么”,我们就不会学习。我猜这是因为你回答了一个重复的问题。不管答案是否完美,人们只是因为个人不“遵守规则”而投反对票,我不介意投反对票,但我认为这是一个学习的机会。不幸的是,如果选民不发表评论,我和提出问题的OP什么也学不到。不好意思,但至少这能回答OP的问题。实际上,我不同意这里的重复链接,因此我将添加更多,因为它使用WHILE
。我将在这个问题下添加一条评论,.你为什么认为@bash的JOIN
很昂贵?只有当你有一个设计糟糕的数据库或查询(或者很多)时,它们才会很昂贵。这个JOIN
不会让事情变得“昂贵”。传递一个带分隔符的列表并将其拆分可能会花费更高的成本。我没有Java方面的经验(至少从15年前上大学开始就没有了),@bash。如果您做了一些研究,但没有找到答案,那么最好问一个新问题,询问如何在Java中使用表值参数(不要忘了在新问题中显示您的尝试)。我建议不要使用重复的解决方案Bash(和@TabAlleman),它使用WHILE
<代码>字符串拆分
、XML拆分器或理货表拆分器是更好的选项,如果您想沿着分隔值路线前进。我为分隔列表添加了一个副本,它提供了比以前添加的更好的解决方案。具体来说,请注意@P的回答ரதீப்.作为参考,在中的基本上是一个或
列表的快捷方式。因此,式中x在(1,2)
中与式中x=1或x=2
相同。将问题标记为重复问题并不一定是认可已接受的答案。在副本中添加了许多答案,其中一个建议使用表值参数。“读者应该仔细阅读所有答案,选择最适合自己需要的答案,并满怀希望地投上一票。”塔巴勒曼不幸的是,这样做(以及互联网)的缺点之一是有些东西活得太久。第一个副本已有10年历史,它们都处理不推荐使用的SQL版本。通过解析旧的答案可以帮助延续在较新版本的软件中已修复的坏习惯,这一问题的答案证明了这一点。寻找这个答案的人很可能只是点击“这个问题已经有答案”链接,而不是在这里阅读更现代、更相关的内容。我更愿意把它看作是一个相关的问题,而不是一个重复的问题。