Динамический Sql с задержкой ожидания для проверки состояния - PullRequest
1 голос
/ 22 апреля 2019

я пытаюсь реализовать логику, где приведенный ниже код выполняется каждые 30 секунд до [execute_result] = 'Выполняется'.

Транзакция завершается, только если [execute_result] <> 'Выполняется'

Ниже приведен код, но, к сожалению, он не работает.

Спасибо

BEGIN

;WITH CTES AS
(
SELECT   e.package_name ,
e.execution_id, 
e.[executable_name] , 
es.[execution_path] , 
es.[execution_duration] , 
es.start_time,
es.end_time,
[execution_result] = CASE ex.[status]
               WHEN 1 THEN 'created' 
               WHEN 2 THEN 'Running' 
               WHEN 3 THEN 'canceled' 
               WHEN 4 THEN 'failed' 
               WHEN 5 THEN 'pending' 

END 

FROM    [catalog].[executables] e 
INNER JOIN [catalog].[executable_statistics] es ON es.[executable_id] = e.[executable_id] 
INNER JOIN [catalog] .[executions] ex ON e.execution_id = ex.execution_id


)

DECLARE @execution_result varchar (100) 
set @execution_result = select execution_result from CTES

IF  @execution_result = 'Running'

WAITFOR DELAY '00:00:30'

END

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

Объявите переменную перед определением общего табличного выражения CTES, как показано ниже, потому что за CTE должен следовать один оператор SELECT, INSERT, UPDATE или DELETE, который ссылается на некоторые или все столбцы CTE.

DECLARE @execution_result varchar (100) ;

WITH CTES AS
(

И установите значение переменной как:

select @execution_result =  execution_result from CTES

Также, чтобы сохранить выполнение кода до тех пор, пока не будет выполнено условие прерывания, которое здесь [execution_result] is <> 'Running', мы можем инкапсулировать всю логику в цикле While как:

SET NOCOUNT ON; 
--Declare all variables 
DECLARE @execution_result varchar (100) ;
--Define an infinite loop
WHILE 1=1
    BEGIN

                WITH CTES AS
                (
                 --All the logic goes here
                )
                select @execution_result =  execution_result from CTES
                --check exit condition here

                IF  @execution_result = 'Running'
                Begin
                     WAITFOR DELAY '00:00:30'
                     CONTINUE;
                End
                Else
                Begin
                     BREAK;
                End

    END;

Надеюсь, этот псевдокод поможет !!

0 голосов
/ 22 апреля 2019

Код ниже работает для меня, но вы можете заменить #tables на CTE и продолжить.

    create table #executables           (executable_id tinyint, execution_id tinyint, package_name nvarchar(20), executable_name nvarchar(20) )
    create table #executable_statistics (executable_id tinyint, execution_path nvarchar(100), execution_duration int, start_time datetime, end_time datetime)
    create table #executions            (execution_id tinyint, [status] tinyint)

    insert #executions (execution_id, [status]) values (1, 2)
    insert #executable_statistics (executable_id) values (1)
    insert #executables (execution_id, executable_id) values (1, 1)


    while 1 = 1
    begin
    select * into #results from (
        select
             e.package_name 
            ,e.execution_id
            ,e.executable_name 
            ,es.execution_path 
            ,es.execution_duration 
            ,es.start_time
            ,es.end_time
            ,execution_result = case ex.[status]
                when 1 then 'created' 
                when 2 then 'Running' 
                when 3 then 'canceled' 
                when 4 then 'failed' 
                when 5 then 'pending' 
                end
        from
            #executables e
            inner join #executable_statistics es on es.executable_id = e.executable_id
            inner join #executions ex on e.execution_id = ex.execution_id
        ) as t


    declare @execution_result varchar (100)
        set @execution_result = ''
     select @execution_result = execution_result from #results
     drop table #results

    if  @execution_result = 'Running'
        begin
            waitfor delay '00:00:30'
        end

    else return

    end

    --select * from #results

    --drop table #executables           
    --drop table #executable_statistics 
    --drop table #executions                    
0 голосов
/ 22 апреля 2019

Похоже, вам нужно будет повторно выполнить запрос после 30 секунд ожидания, чтобы повторно проверить состояние.Судя по вашему запросу, похоже, что вы проверили его только один раз, и ваша программа может завершиться через 30 секунд.Может быть, вам нужна логика типа do...while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...