停止trace的儲存過程
這個儲存過程和建立trace的儲存過程配合,可以非常靈活的控制trace的建立和停止。一般地,在作業中建立trace,可以設定trace執行的時間,到時間trace自動停止,不需要使用這個儲存過程停止。用這個儲存過程,是可以手動停止trace的執行。
use system
goif exists(select * from sysobjects where xtype='p' and name ='up_autotrace_stop')
drop procedure up_autotrace_stop
gocreate procedure up_autotrace_stop
@traceid int =0, --預設全部停止
@events varchar(512) = '' --要trace的事件,逗號為分隔符
as/**********
--檔名 :
--用途 :停止trace作業
--輸入引數 :
--返回值解釋 :
--建立者 : summer.yang
--建立日期 : 2005-6-18
--修改者 :
--修改日期 :
--修改註解 :(引用請保留此資訊)
--備註說明 :
**********/
set nocount on
--錯誤處理
declare @message nvarchar(4000)
declare @return int
set @return=0
set @message=''
---------------
--如果不存在開啟的trace,則直接結束
if not exists(select * from :: fn_trace_getinfo(0))
begin
set @message='there is no active trace in this server.'
goto finish
end-------------
declare @cursor cursor
--如果@traceid>0,則停止@traceid,
if @traceid>=1
begin
if exists (select * from :: fn_trace_getinfo(@traceid))
begin
exec sp_trace_setstatus @traceid, 0 --停止跟蹤
exec sp_trace_setstatus @traceid, 2 --關閉跟蹤
set @message= '儲存過程up_autotrace_stop: 成功停止乙個trace,此trace的id為:'+ltrim(str( @traceid))
endelse
begin
set @message= '儲存過程up_autotrace_stop: 無此traceid,輸入的traceid為:'+ltrim(str( @traceid))
set @return=-96
goto finish
endend
else if @traceid=0
begin --根據@events的值判斷
if len(@events)>0
begin--009
declare @tblevents table( eventid int not null )
declare @lenevents int,@estart int,@enext int
set @lenevents = len(@events)
select @estart = 1
select @enext = charindex(',',@events,@estart)
--輸入的trace的事件
while @enext > 0
begin
insert into @tblevents
select cast(substring(@events,@estart,@enext-@estart) as int)
--迴圈值增長
select @estart = @enext + 1
select @enext = charindex(',',@events,@estart)
if @enext = 0 set @enext = @lenevents + 1
if @estart > @lenevents set @enext = 0
end--刪除不正確的事件id
delete from @tblevents
where eventid<=9
or eventid>=119
or eventid in (29,31,32,48,49,56,57,62,63,64,65,66,99,101)
if not exists (select * from @tblevents)--不存在有效的事件
begin
set @message='儲存過程up_autotrace_stop: 輸入的事件型別無效!'+char(10)
+'輸入的事件型別是:'+@events
set @return=-98
goto finish
endend--009
set @cursor=cursor forward_only static for
select distinct traceid from :: fn_trace_getinfo(0)--已經存在的跟蹤
open @cursor
fetch next from @cursor into @traceid
while @@fetch_status=0
begin--008
if len(@events)>0
begin--如果@traceid=0,而@events有合法的事件,則查詢相應的@traceid停止
if not exists (
select * from @tblevents a
full outer join (select distinct eventid from ::fn_trace_geteventinfo(@traceid)
) bon a.eventid=b.eventid
where a.eventid is null
or b.eventid is null )
begin
exec sp_trace_setstatus @traceid, 0 --停止跟蹤
exec sp_trace_setstatus @traceid, 2 --關閉跟蹤
set @message= '儲存過程up_autotrace_stop: 成功停止乙個trace,此trace的事件列為:' +char(10)+@events
goto finish
endend
else--如果@traceid=0,而@events沒有合法的事件,則全部停止
begin
exec sp_trace_setstatus @traceid, 0 --停止跟蹤
exec sp_trace_setstatus @traceid, 2 --關閉跟蹤
print @message
set @message= '儲存過程up_autotrace_stop: 成功停止乙個trace,此trace的id為:'+ltrim(str( @traceid))
endfetch next from @cursor into @traceid
end--008
if len(@events)>0
begin
--沒有找到對應的事件列
set @message='儲存過程up_autotrace_stop: 沒有找到對應事件列的trace,未停止任何trace.'+char(10)
+'要查詢的事件列為:'+char(10)+@events
set @return=-97
goto finish
endend
-----------------
finish:
if @return<>0
begin
raiserror (@message,16,1 ) --with log
return @return
endelse
begin
print @message
--exec master.dbo.xp_logevent 70000,@message,informational
return @return
endgo
檢查trace的儲存過程
這個儲存過程用於檢查trace所在分割槽的空間大小,如果小於設定的值,則停止儲存到這個分割槽的trace if exists select from dbo.sysobjects where xtype p and name up autotrace check drop procedure up ...
批量刪除儲存過程的儲存過程
create procedure dropprocedure as declare cur cursor read only for select name from sysobjects where xtype p and name like drop declare name varchar 4...
儲存過程調儲存過程的事務
直接上 是在包裡寫的儲存過程,要測試的話,要先寫宣告 宣告procedure test1 p retcode in out varchar2,p retinfo in out varchar2 procedure test2 p retcode in out varchar2,p retinfo i...