我正在尝试实现逻辑,其中以下代码每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
答案 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