【问题标题】:How to pass more than one id to stored procedure如何将多个 id 传递给存储过程
【发布时间】:2013-08-28 05:02:17
【问题描述】:

我在这样的存储过程中有一个查询:

CREATE PROCEDURE DELETEREP (@id INT) 
AS 
    DELETE FROM TABLE 
    WHERE  ID = @id 

现在我想从另一个存储过程执行这个存储过程,如下所示:

exec(Deleterep) from here i want to pass multiple ids like 

where  id in (selec id from table2)

我想将多个 ID 传递给 SP。 我不想多次调用存储过程,使用游标或循环,我想避免它。

有人可以告诉我如何进行吗?

【问题讨论】:

  • 您使用的是什么数据库? SQLServer,MYSQL,甲骨文?还有什么版本?最新版本的 SQLServer 可以使用 XML 参数
  • 我使用的是sql server
  • @rs 我已经浏览了那个链接并且正在使用光标,它会一次又一次地调用存储过程我想避免它,请再次阅读问题
  • 你使用的是哪个版本的sql server?

标签: sql sql-server stored-procedures sql-server-2008-r2


【解决方案1】:

您可以按照 Devart 的建议使用 XML,但这里还有两个选项。

逗号分隔列表(可以用其他方法拆分,我这里用的是convert to xml):

create procedure usp_test1(@list nvarchar(max))
as
begin
    declare @data xml

    select @data = cast('<id>' + replace(@list, ', ', '</id><id>') + '</id>' as xml)

    select *
    from test
    where id in
      (
          select t.c.value('.', 'int') as a
          from @data.nodes('id') as t(c)
      )
end

或用户定义的表类型:

create type list as table (id int primary key)

create procedure usp_test2(@list list readonly)
as
begin
    select *
    from test
    where id in (select id from @list)
end

参见sql fiddle demo 2 个示例

【讨论】:

  • CREATE PROCEDURE: "在命名过程时避免使用 sp_ 前缀。SQL Server 使用此前缀来指定系统过程。使用前缀会导致应用程序代码如果存在同名的系统过程,则中断。”
  • @Damien_The_Unbeliever 感谢在我们的系统中我们使用usp 作为前缀,这只是举例,但你是对的,会改变答案
【解决方案2】:
Try this one -

CREATE PROCEDURE dbo.usp_DELETEREP 
(
    @XML XML
) 
AS BEGIN

    DELETE FROM dbo.[TABLE] 
    WHERE ID IN (
        SELECT t.c.value('.', 'BIGINT')
        FROM @XML.nodes('/data/id') t(c)
    )

END

GO

DECLARE @XML XML
SELECT @XML = '
<data>
    <id>1</id>
    <id>2</id>
</data>'

EXEC usp_DELETEREP @XML = @XML

【讨论】:

  • 我无法修改存储过程,它是由其他程序员开发的,并且在多个文件中使用,所以我不能修改sp,我只能调用这个sp,谢谢
  • 你能新建一个存储过程吗?
  • 我可以创作,而且我的工作中并没有被这个问题困扰,我只是为了知识而想知道,这种场景是否可以实现
  • 是的,当然。我个人更喜欢XML,但用户定义的表类型对于2008(及更高版本)服务器版本也是不错的选择。
【解决方案3】:

你可以直接在 SP 的定义中使用它

CREATE PROCEDURE DELETEREP (@id INT,@id1 int,@id2 int) 
AS 
    DELETE FROM TABLE 
    WHERE  ID in (@id,@id1,@id2)

如果您要从表中获取这些 id,只需声明一个 #temp 表或表变量

喜欢

CREATE PROCEDURE DELETEREP 

AS 

    Declare @TEMP_TABLE TABLE ( ID INT)

    INSERT INTO @TEMP_TABLE select id from table2

        DELETE FROM TABLE 
        WHERE  ID in (SELECT ID FROM @TEMP_TABLE)

或者你可以直接在SP中使用你的table2

如果有任何帮助,请告诉我。

问候, 阿舒托什·艾莉亚

【讨论】:

  • 我无法修改存储过程,它是由其他程序员开发的,并且在多个文件中使用,所以我不能修改sp,我只能调用这个sp,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
相关资源
最近更新 更多