我有一个包含四个字段a,b,c,d
的sql表和一个存储过程sp_x
。
如何创建一个定期运行并执行两项操作的作业(只需一个选择):
为c
的行更新字段d
和字段b=1
;
之后执行sp_x
传递字段a
但仅适用于b=1
答案 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
所有内容都在您想要的作业中运行