当前位置: 代码迷 >> Sql Server >> 【高分赏格】【难度大】【存储过程】【100分】【顶者都有分】
  详细解决方案

【高分赏格】【难度大】【存储过程】【100分】【顶者都有分】

热度:35   发布时间:2016-04-24 19:11:31.0
【高分悬赏】【难度大】【存储过程】【100分】【顶者都有分】

 --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 升序执行语句


------解决方案--------------------
先顶后看
------解决方案--------------------
如果事务回滚,你的记录也会回滚哦
------解决方案--------------------

------解决方案--------------------
帮楼主顶啊
------解决方案--------------------
先顶后看  
------解决方案--------------------
之前公司有个sp,出问题了事务回滚,结果当时记录在日志表中的信息也跟着回滚了
------解决方案--------------------
你的意思是,这个存储过程:exec  OpreateTB

会按照顺序来执行你的表 TB_CMD 中的语句,执行后,更新每个语句在TB_CMD表中的状态,显示是否执行成功,执行时间等信息吗?

------解决方案--------------------
引用:
Quote: 引用:

你的意思是,这个存储过程:exec  OpreateTB

会按照顺序来执行你的表 TB_CMD 中的语句,执行后,更新每个语句在TB_CMD表中的状态,显示是否执行成功,执行时间等信息吗?

嗯,就是这个意思


写了一个,但是好像,每个语句执行,就会报错。。。

看了一下,因为你的语句sqlevent,都是临时表,用exec执行创建临时表后,后面对临时表进行操作,那么就会报错。

因为这些通过exec执行语句,创建的临时表,只是在创建的那个临时表中存在,一旦执行完成后,就自动删除了。
------解决方案--------------------
这个存储过程:
create proc dbo.OpreateTB
--@OpreateUser nvarchar(100),
--@IsRun nvarchar(10)
as

declare @i int
declare @start datetime
declare @sql nvarchar(max)
declare @error int
declare @ROWCOUNT int
  相关解决方案