2012-07-10 109 views
4

我有一个很长的存储过程,我如何知道它的执行状态?如50%完成等 我搜索了很多,并没有得到任何满意的结果。所以希望这是不可能的。我正在使用MS SQL Server 2008.如果它不可用 我可能知道它的原因不可用?如何知道MS SQL Server中存储过程的执行状态

回答

5

您可以使用:

RAISERROR ('Some comment, immediate', 0, 1) WITH NOWAIT 

此声明后立即打印消息。 (它不会产生错误信息)。

+0

@Janis谢谢你,所以我们只能在使用SSMS执行时看到这个值。对 ? – kbvishnu 2012-07-10 14:21:08

+1

最好的部分:不!你可以从.NET访问他们:http://stackoverflow.com/questions/765142/access-to-sql-server-messages-via-ado-net – 2012-07-10 14:25:23

3

不,至少在您描述的形式中不可用。这是因为很难知道存储过程在内部需要做什么(如果它调用其他存储过程,会怎么样?)以及需要多长时间,直到它尝试去做。

当然,你可以检查proc和看到它SELECT * FROM [TableName]

但随后你需要知道表的大小,返回的数据类型,磁盘访问速度,查询是否已缓存等等等等。

那么,如果另一个进程意外地锁定了一条记录并且比平时花费更多时间呢?你不知道这把锁会持续多久 - 那么你如何计算未知变量(时间)的百分比?

您可以做的最好的做法是在您的proc中将“检查点”放入print消息或发送电子邮件或在每个离散步骤后登录表格,例如,

print getdate() 
print 'Selecting from [Users]' 

Select * from [Users] 

print getdate() 
print 'Selecting from [Clients]' 

Select * from [Clients] 

print getdate() 
print 'Finished' 
+0

这是一个选项。但请考虑事务下正在运行的情况。如果我们有一个日志表,并且我们试图输入日期时间,但是我们只能在事务后才能看到。所以我们需要等到那个时候。我希望我是对的。请告诉我,如果这是错误的。 – kbvishnu 2012-07-10 14:14:25

+1

如果'PRINT'语句是唯一产生输出的东西,那么在整个过程完成之前,由于缓冲,您可能不会收到任何东西。'RAISERROR('从[Users]中选择',10,1)WITH NOWAIT '发送一条信息性消息,不会遇到缓冲问题。 – 2012-07-10 14:17:42

+0

@VeeKeyBee是的,没错 - 如果“TRANSACTION”被回滚,表格记录的想法将被撤消,但是一般的“检查点”方法仍然可行。 – Widor 2012-07-10 14:18:36

1

SQL Server没有内置任何功能来检查存储过程的状态,但是您可以编写一些类似的东西。在我们的例子中,我们创建了一个日志功能,在存储过程中的每个进程之后发布消息。

比方说,你有运行多个查询一个存储过程:

SELECT * 
FROM yourTable 

UPDATE ... 
SET ... 

DELETE 
FROM ... 

可以到位每个查询/处理之后的一个步骤,将数据发布到记录表:

SELECT * 
FROM yourTable 

-- log query 
INSERT INTO LogTable (DateComplete, Status, TaskId) 
VALUES (getdate(), 'Complete', 1) 

UPDATE ... 
SET ... 

-- log query 
INSERT INTO LogTable (DateComplete, Status, TaskId) 
VALUES (getdate(), 'Complete', 2) 

DELETE 
FROM ... 

-- log query 
INSERT INTO LogTable (DateComplete, Status, TaskId) 
VALUES (getdate(), 'Complete', 3) 

您可以通过在查询周围使用TRY...CATCH块来进一步实现此功能,然后您可以针对该过程是否成功或失败获得不同的消息。

2

如果你有.NET客户端应用程序可以通过在C#中使用以下语法接收由服务器发送的近似进度消息:

using (SqlConnection conn = new SqlConnection(...)) 
    { 
     conn.FireInfoMessageEventOnUserErrors = true; 
     conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage); 
     using (SqlCommand comm = new SqlCommand("dbo.sp1", conn) 
       { CommandType = CommandType.StoredProcedure }) 
     { 
      conn.Open(); 
      comm.ExecuteNonQuery(); 
     } 
    } 

    static void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e) 
    { 
     // Process received message 
    } 

虽然可以如一个由詹尼斯描述被发送,在服务器端的消息以前的答案:

RAISERROR('33%%..', 10, 0) WITH NOWAIT 
相关问题