我有一个很长的存储过程,如何知道它的执行状态?类似于50%已完成等等。我搜索了很多,但没有得到满意的结果。所以希望这不是可能的。我正在使用MS SQL Server 2008。如果不可用,我可以知道为什么不可用吗?
我有一个很长的存储过程,如何知道它的执行状态?类似于50%已完成等等。我搜索了很多,但没有得到满意的结果。所以希望这不是可能的。我正在使用MS SQL Server 2008。如果不可用,我可以知道为什么不可用吗?
RAISERROR ('Some comment, immediate', 0, 1) WITH NOWAIT
在此语句之后立即输出消息(不会生成错误消息)。
print getdate()
print 'Selecting from [Users]'
Select * from [Users]
print getdate()
print 'Selecting from [Clients]'
Select * from [Clients]
print getdate()
print 'Finished'
PRINT
语句是唯一产生输出的内容,由于缓冲区的原因,您可能要等到整个过程完成才能收到任何输出。使用RAISERROR('Selecting from [Users]',10,1) WITH NOWAIT
可以发送信息性消息,并且不会遇到缓冲问题。 - Damien_The_UnbelieverTRANSACTION
被回滚了,那么表日志记录的想法就会被撤销,但是一般的“检查点”方法仍然有效。 - Widor如果您有一个.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
}
在服务器端,可以按照Janis在之前的回答中描述的方式发送消息:
RAISERROR('33%%..', 10, 0) WITH NOWAIT
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
块来进一步操作,然后可以根据过程是否成功或失败来显示不同的消息。