我有一个很长的存储过程,我如何知道它的执行状态?完成了 50% 之类的东西。我进行了很多搜索,但没有得到任何满意的结果。所以希望这是不可能的。我使用的是 MS SQL Server 2008。如果它不可用,我可以知道它不可用的原因可用的 ?
4 回答
您可以使用:
RAISERROR ('Some comment, immediate', 0, 1) WITH NOWAIT
在此声明后立即打印消息。(它不会生成错误消息)。
不,至少以您描述的形式不可用。这是因为很难知道存储过程在内部必须做什么(如果它调用其他存储过程怎么办?)以及在尝试执行之前需要多长时间。
当然,您可以检查 proc 并查看它SELECT * FROM [TableName]
但是你需要知道表的大小、返回的数据类型、磁盘访问速度、查询是否被缓存等等。
那么,如果另一个进程意外地锁定了一条记录并且比平时花费了更长的时间怎么办?您不知道该锁将持有多长时间 - 那么您如何计算未知变量(时间)的百分比?
您可以做的最好的事情是在您的过程中放置“检查点”以print
在每个离散步骤之后发送消息或发送电子邮件或登录表格,例如
print getdate()
print 'Selecting from [Users]'
Select * from [Users]
print getdate()
print 'Selecting from [Clients]'
Select * from [Clients]
print getdate()
print 'Finished'
如果您有一个 .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
,然后您可以收到有关该过程是成功还是失败的不同消息。