具有等待延迟的动态SQL检查状态

时间:2019-04-22 12:08:25

标签: sql sql-server

我正在尝试实现逻辑,其中以下代码每30秒运行一次 直到[execution_result] =“正在运行”。

仅当[execution_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 个答案:

答案 0 :(得分:2)

在按如下所述定义公用表表达式CTES之前声明变量,因为CTE后面必须是引用某些或所有CTE列的单个SELECT,INSERT,UPDATE或DELETE语句。

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;

希望此伪代码有帮助!

答案 1 :(得分:0)

在等待30秒以重新检查状态后,您似乎需要重新执行查询。从查询的外观看,您似乎只检查了一次,可能您的程序可能在30秒后退出。可能是您需要一种do...while循环逻辑。

答案 2 :(得分:-1)

下面的代码对我有用,但是您可以用CTE替换#tables并继续。

    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