根据选择结果从sql作业运行存储过程

时间:2015-09-09 08:12:36

标签: sql-server stored-procedures sql-server-2008-r2 jobs

我有一个包含四个字段a,b,c,d的sql表和一个存储过程sp_x

如何创建一个定期运行并执行两项操作的作业(只需一个选择):

  1. c的行更新字段d和字段b=1;

  2. 之后执行sp_x传递字段a但仅适用于b=1

  3. 的行

2 个答案:

答案 0 :(得分:0)

您可以使用update语句的“output”来接收刚刚更新的列的行id,并将此数据写入临时表或表变量。

然后允许使用更多语句来处理日志记录活动。

您还可以考虑在桌面上使用更新触发器,以便在状态发生变化时执行日志记录。

use [tempdb];
go

create table [outputexample]
(
      [rowid] int identity(1,1)
    , [datetime] datetime default (getdate()) not null
    , [status] varchar(20) not null
);

insert into [outputexample] ([status])
select 'Active' union all
select 'Closed' union all
select 'Active'
go

预定的工作代码:

declare @updatedrow table
(
    [rowid] int
);

update [outputexample]
set [datetime] = getdate()
    , [status] = 'Closed'
output inserted.[rowid]
into @updatedrow
where [datetime] < getdate()
    and [status] <> 'Closed';


declare @rowid int;

declare cursor_updatedrow cursor for
select [rowid] from @updatedrow;

open cursor_updatedrow;

fetch next from cursor_updatedrow into @rowid;

while @@fetch_status = 0
begin

    -- exec sp_myauditsp @rowid = @rowid
    print cast(@rowid as varchar(20)) + ' was updated to closed.'

    fetch next from cursor_updatedrow into @rowid;
end

close cursor_updatedrow;
deallocate cursor_updatedrow;

答案 1 :(得分:0)

更新所需的行:

UPDATE mytable SET C=..., D=... WHERE B=1

仅对某些行执行存储过程:

DECLARE @a int
DECLARE my_cursor CURSOR
FOR SELECT a FROM jobtable WHERE b=1
OPEN my_cursor
FETCH NEXT FROM my_cursor INTO @a
WHILE @@FETCH_STATUS=0
BEGIN 
  EXEC sp_x @a
END
FETCH NEXT FROM my_cursor into @a
CLOSE my_cursor
DEALLOCATE my_Cursor

所有内容都在您想要的作业中运行