Вызов хранимой процедуры для каждой строки из выбора - PullRequest
2 голосов
/ 15 мая 2019

У меня есть куча записей из моего выбора.Я должен вызвать определенную хранимую процедуру для каждой строки из этого выбора.Я знаю, что это можно сделать с помощью курсоров (я нашел ответы об этом в SO - но они все очень старые).Мне интересно, есть ли какая-нибудь другая возможность сегодня, в современной версии SQL-сервера?

Мой выбор:

SELECT USER_KEY, USER_WHK FROM BAUSER WHERE USER_STA = '1'

Моя вставка:

EXEC sp_BAUSCA_BASE 
  @iUSCA_KEY = NULL
, @iCAET_KEY = 150000003
, @iUSER_KEY = --user key from select
, @iENTE_KEY = 110000001
, @dUSCA_DAT = GETDATE()
, @cUSCA_STA = '1'
, @cUSCA_SRT = '1'
, @iUserId = 160000230
, @cTask = '2'

Ответы [ 2 ]

4 голосов
/ 15 мая 2019

Вы можете заархивировать это требование с помощью Курсор , я сделал демонстрацию для вашего, это может вам помочь.

Для получения дополнительной информации о курсоре, вы можете посетить это ссылка .

Демо

DECLARE 
@iUSCA_KEY  NVARCHAR(50) ,
@iCAET_KEY  NVARCHAR(50) ,
@iUSER_KEY  NVARCHAR(50) ,
@iENTE_KEY  NVARCHAR(50) ,
@dUSCA_DAT  DATETIME,
@cUSCA_STA  NVARCHAR(50) ,
@cUSCA_SRT  NVARCHAR(50) ,
@iUserId    INT,
@cTask      NVARCHAR(50) 

DECLARE MY_data CURSOR LOCAL FAST_FORWARD
FOR
    SELECT  
    iUSCA_KEY,  
    iCAET_KEY , 
    iUSER_KEY , 
    iENTE_KEY , 
    dUSCA_DAT,  
    cUSCA_STA,  
    cUSCA_SRT , 
    iUserId ,   
    cTask      
    FROM    BAUSER WHERE USER_STA = '1'


OPEN MY_data
FETCH NEXT FROM MY_data INTO @iUSCA_KEY,@iCAET_KEY,@iUSER_KEY,@iENTE_KEY,@dUSCA_DAT,@cUSCA_STA,@cUSCA_SRT,@iUserId,@cTask  
WHILE @@FETCH_STATUS = 0
    BEGIN

       EXEC sp_BAUSCA_BASE 
            @iUSCA_KEY = @iUSCA_KEY
            , @iCAET_KEY = @iCAET_KEY
            , @iUSER_KEY = @iUSER_KEY
            , @iENTE_KEY = @iENTE_KEY
            , @dUSCA_DAT = @dUSCA_DAT
            , @cUSCA_STA = @cUSCA_STA
            , @cUSCA_SRT = @cUSCA_SRT
            , @iUserId = @iUserId
            , @cTask = @cTask

        FETCH NEXT FROM MY_data INTO  @iUSCA_KEY,@iCAET_KEY,@iUSER_KEY,@iENTE_KEY,@dUSCA_DAT,@cUSCA_STA,@cUSCA_SRT,@iUserId,@cTask  
    END
CLOSE MY_data
DEALLOCATE MY_data
1 голос
/ 15 мая 2019

Я говорю с коррекцией, но, насколько я понимаю, цикл немного более ресурсоемкий.

Однако вы также можете выполнить его с помощью цикла.

Обратите внимание, чтоЯ не смог протестировать его, так как у меня нет исходных данных и SP, которые есть у вас, но я уверен, что скрипт является пуленепробиваемым:

DECLARE     @LOOP       INT
,           @iUSCAKEY   INT
,           @iCAETKEY   INT
,           @iUSERKEY   INT
,           @iENTEKEY   INT
,           @cUSCASTA   VARCHAR(10)
,           @cUSCASRT   VARCHAR(10)
,           @iUserId    BIGINT
,           @cTask  VARCHAR(100)

DECLARE @TBL AS TABLE   (
                            ID INT PRIMARY KEY IDENTITY
                        ,   iUSCA_KEY   INT
                        ,   iCAET_KEY   INT
                        ,   iUSER_KEY   INT
                        ,   iENTE_KEY   INT
                        ,   cUSCA_STA   VARCHAR(10)
                        ,   cUSCA_SRT   VARCHAR(10)
                        ,   iUserId     BIGINT
                        ,   cTask       VARCHAR(100)

                        )

INSERT INTO @TBL        (
                            iUSCA_KEY
                        ,   iCAET_KEY
                        ,   iUSER_KEY
                        ,   iENTE_KEY
                        ,   cUSCA_STA
                        ,   cUSCA_SRT
                        ,   iUserId
                        ,   cTask

                        )
                        SELECT
                            iUSCA_KEY
                        ,   iCAET_KEY
                        ,   iUSER_KEY
                        ,   iENTE_KEY
                        ,   cUSCA_STA
                        ,   cUSCA_SRT
                        ,   iUserId
                        ,   cTask
                        FROM BAUSER
                        WHERE USER_STA = '1'


        SELECT @LOOP = MIN(ID) FROM @TBL
        WHILE @LOOP IS NOT NULL

            BEGIN

                    SELECT
                        @iUSCAKEY   =   iUSCA_KEY
                    ,   @iCAETKEY   =   iCAET_KEY
                    ,   @iUSERKEY   =   iUSER_KEY
                    ,   @iENTEKEY   =   iENTE_KEY
                    ,   @cUSCASTA   =   cUSCA_STA
                    ,   @cUSCASRT   =   cUSCA_SRT
                    ,   @iUserId    =   iUserId
                    ,   @cTask      =   cTask
                    FROM    @TBL
                    WHERE   ID  =   @LOOP

                    EXEC sp_BAUSCA_BASE 
                      @iUSCA_KEY    =   @iUSCAKEY
                    , @iCAET_KEY    =   @iCAETKEY
                    , @iUSER_KEY    =   @iUSERKEY
                    , @iENTE_KEY    =   @iENTEKEY
                    , @dUSCA_DAT    =   GETDATE()
                    , @cUSCA_STA    =   @cUSCASTA
                    , @cUSCA_SRT    =   @cUSCASRT
                    , @iUserId      =   @iUserId
                    , @cTask        =   @cTask

                SELECT @LOOP = MIN(ID) FROM @TBL WHERE ID > @LOOP

            END

Дайте мне знать, сработало ли это.

...