如何不从存储过程返回结果?

时间:2021-01-13 13:21:36

标签: sql sql-server database

我有一个问题,我有一个存储过程,它返回结果,而且我在游标中的另一个过程中使用这个过程在表中插入一些数据,但是这个在游标中使用的过程返回数据,但我不在这种情况下不需要它。我只需要调用这个过程的过程的结果。

第一步:

ALTER PROCEDURE [dbo].[CopyInterface]
( 
    @intercafeId int,
    @processIdPrefix nvarchar(50)
)
AS
BEGIN

DECLARE
    @newInterfaceId int

SET NOCOUNT ON;

BEGIN TRANSACTION

....
some code
....


        DECLARE @taskIdsToCopy table (interfacetaskid int NOT NULL)

        INSERT INTO @taskIdsToCopy(interfacetaskid)
        SELECT interfacetaskid FROM icinterfacetask
        WHERE interfaceid = @intercafeId


        DECLARE @taskIdForCursor int
        DECLARE @newTaskId TABLE (id int)
        DECLARE cur CURSOR LOCAL FOR
            select interfacetaskid from @taskIdsToCopy


        OPEN cur
        FETCH NEXT FROM cur INTO @taskIdForCursor
        
        while @@FETCH_STATUS = 0
        BEGIN

                EXEC CopyTask @taskIdForCursor, @newInterfaceId
            FETCH NEXT FROM cur INTO @taskIdForCursor
        END
        CLOSE cur
        DEALLOCATE cur
    
COMMIT TRANSACTION;

SELECT @newInterfaceId;

END

第二个程序:

ALTER PROCEDURE [dbo].[CopyTask] 
    @taskid int, 
    @destinationinterfaceid int = 0
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @newTaskIds table (id int NOT NULL)
    DECLARE @stepIdsToCopy table (id int NOT NULL)
...
some code
...

        declare @newId int = (select top 1 id from @newTaskIds);


        INSERT INTO @stepIdsToCopy(id)
        SELECT schemastepid FROM icschemastep
        WHERE interfacetaskid = @taskid

        DECLARE @stepIdForCursor int
        DECLARE @newStepIds TABLE (id int)
        DECLARE cur CURSOR LOCAL FOR
            select id from @stepIdsToCopy

        OPEN cur
        FETCH NEXT FROM cur INTO @stepIdForCursor

        while @@FETCH_STATUS = 0 
        BEGIN
            INSERT INTO @newStepIds
                EXEC dbo.CopyStep @stepIdForCursor, @newId
            FETCH NEXT FROM cur INTO @stepIdForCursor
        END
        CLOSE cur
        DEALLOCATE cur

    
    ;with cte as (
    select steptar.schemasteporder oldorder, steptar.schemastepid oldid
        from icschemastep as steptar
            inner join icinterfacetask as tasktar on tasktar.interfacetaskid = steptar.interfacetaskid
            inner join icschemastep as stepsour on stepsour.dataproviderid = steptar.schemastepid
            inner join icinterfacetask as tasksour on tasksour.interfacetaskid = stepsour.interfacetaskid
        where  tasksour.interfacetaskid = @taskid
        and stepsour.steptype = 10 
        )
        select steptar.schemastepid as newstepforgoto, cte.oldid as oldid
            into #newgotosteps  
                from icschemastep as steptar
                    inner join cte as cte on cte.oldorder = steptar.schemasteporder
                where steptar.interfacetaskid = @newId

    update steptar
        set
            dataproviderid = new.newstepforgoto
        from icschemastep as steptar
            inner join icschemastep as stepsour on stepsour.schemasteporder = steptar.schemasteporder
            inner join icschemastep as oldstep on oldstep.schemastepid = steptar.dataproviderid
            inner join #newgotosteps as new on new.oldid = steptar.dataproviderid
        where stepsour.interfacetaskid = @taskid and steptar.interfacetaskid = @newId
        
    COMMIT TRANSACTION;
    
    SELECT @newId 
END

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果我正确理解您要查找的内容,我建议您尝试使用输出参数。其中一个或多个应该可以满足您的需求。 Microsoft has a good document available 了解它们的工作方式,包括如何在代码示例中处理它。