1

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

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。我不想使用游标或循环多次调用存储过程,我想避免它。

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

4

3 回答 3

2

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

逗号分隔列表(您可以使用其他方法将其拆分,我在这里使用了转换为 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 demo2个例子

于 2013-08-28T05:40:56.503 回答
1

您可以直接在 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

请让我知道这是否有帮助。

问候, 阿舒托什·艾莉亚

于 2013-08-28T05:20:09.177 回答
1
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
于 2013-08-28T05:21:00.650 回答