您的位置:首页 > 数据库 > SQL

监控SQL:监控SQL的执行情况(3)

2014-01-24 16:51 393 查看
需求:
--delete from tb_CMd    CREATE TABLE [dbo].[TB_CMD]( 	[RowGuid] [nvarchar](50) NOT NULL, 	[RunTime] [date] NULL, 	[RunStatus] [int] NULL, 	[SqlEvent] [nvarchar](max) NULL, 	[OrderNumber] [int] NULL, 	[IsRun] [bit] NULL, 	[OpreateUser] [nchar](10) NULL, 	[SqlType] [nchar](10) NULL, 	[BetweenTime] [int] NULL, 	[RunLog] [nvarchar](200) NULL,  CONSTRAINT [PK_TB_CMD] PRIMARY KEY CLUSTERED  ( 	[RowGuid] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY]  GO  ALTER TABLE [dbo].[TB_CMD] ADD  CONSTRAINT [DF_TB_CMD_RowGuid]  DEFAULT (newid()) FOR [RowGuid] GO  insert into tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser )values('create table #tb (id int ,name varchar(10))',1,0,'Tom') insert into tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser )values('insert into #tb select 1,''test1''',2,0,'Tom') insert into tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser  )values('insert into #tb select 1,''test1''',3,0,'Jack') insert into tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser  )values('insert into #tb select 2,''test2''',4,0,'Tom') insert into tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser  )values('update #tb set name =''test_1'' where id =1''',5,0,'Tom') insert into tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser  )values('delete  from #tb where id=1',6,0,'Tom') insert into tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser  )values('select * from #tb',7,0,'Tom') insert into tb_CMd (sqlevent ,OrderNumber,IsRun,OpreateUser )values('drop table #tb',8,1,'Tom') go select * from tb_cmd   order by OrderNumber asc   --IsRun :是否执行语句 0 表示 未执行,1表示已执行 ----------------------------------  ---解释一下本人的需求   ----通过执行一个 带参数的存储过程  exec  OpreateTB('OpreateUser','IsRun')   -- 更新这张表的数据  (RunTime,RunStatus,BetweenTime,RunLog,IsRun)  --- RunTime 这条语句的执行时间    -- RunStatus 为执行语句是否成功  1表示执行成功   0 表示异常  NULL 就是还未执行 -1表示回滚  ---BetweenTime :执行这条语句所用时间  --RunLog 执行 返回的消息结果  如(1行影响)  --执行过程如果有错误语句直接回滚 并且 Runlog 都更新为'回滚'  --执行 按照 OrderNumber 升序执行语句

建表语句:
if object_id('tb') is not null      drop table tb go  insert into   tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser )values('create table tb (id int ,name varchar(10))',1,0,'Tom') insert into   tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser  )values('insert into tb select 1,''test1''',2,0,'Tom') insert into   tb_CMd (sqlevent,OrderNumber,IsRun,OpreateUser  )values('insert into tb select.  2,''test2''',3,0,'Tom')

存储过程:
create proc dbo.OpreateTB --@OpreateUser nvarchar(100), --@IsRun nvarchar(10) as  declare @i int declare @start datetime declare @sql nvarchar(max) declare @OrderNumber int declare @error int declare @ROWCOUNT int  set @i = 1;  while @i <= (select COUNT(*) from [TB_CMD]) begin     --按照[OrderNumber]进行了排序,每次取出1条    ;with t    as    (      select *,             ROW_NUMBER() over(order by [OrderNumber]) rownum        from [TB_CMD]    )        select  @sql = [SqlEvent],            @OrderNumber = [OrderNumber]    from t    where rownum = @i        set @start = GETDATE()        exec(@sql);        select @error = @@ERROR,           @ROWCOUNT = @@ROWCOUNT                        update [TB_CMD]    set BetweenTime = datediff(ms,@start,GETDATE()),        RunLog = case when @error = 0 then '('+cast(@ROWCOUNT as varchar)+'行影响)'                      else '回滚'                 end,        RunStatus = case when @error = 0 then 1                         when @error <> 1  then 0                    end,        IsRun = 1    where [OrderNumber] = @OrderNumber  --这里也修改了        set @i = @i + 1 end  go


本文出自 “探索SQLServer” 博客,请务必保留此出处http://yupeigu.blog.51cto.com/3323001/1367943
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: