我有一个很长的存储过程,我如何知道它的执行状态?如50%完成等 我搜索了很多,并没有得到任何满意的结果。所以希望这是不可能的。我正在使用MS SQL Server 2008.如果它不可用 我可能知道它的原因不可用?如何知道MS SQL Server中存储过程的执行状态
回答
您可以使用:
RAISERROR ('Some comment, immediate', 0, 1) WITH NOWAIT
此声明后立即打印消息。 (它不会产生错误信息)。
不,至少在您描述的形式中不可用。这是因为很难知道存储过程在内部需要做什么(如果它调用其他存储过程,会怎么样?)以及需要多长时间,直到它尝试去做。
当然,你可以检查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'
这是一个选项。但请考虑事务下正在运行的情况。如果我们有一个日志表,并且我们试图输入日期时间,但是我们只能在事务后才能看到。所以我们需要等到那个时候。我希望我是对的。请告诉我,如果这是错误的。 – kbvishnu 2012-07-10 14:14:25
如果'PRINT'语句是唯一产生输出的东西,那么在整个过程完成之前,由于缓冲,您可能不会收到任何东西。'RAISERROR('从[Users]中选择',10,1)WITH NOWAIT '发送一条信息性消息,不会遇到缓冲问题。 – 2012-07-10 14:17:42
@VeeKeyBee是的,没错 - 如果“TRANSACTION”被回滚,表格记录的想法将被撤消,但是一般的“检查点”方法仍然可行。 – Widor 2012-07-10 14:18:36
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
块来进一步实现此功能,然后您可以针对该过程是否成功或失败获得不同的消息。
如果你有.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
- 1. 如何知道我的存储过程是否在MS SQL Server中被删除?
- 2. 在SQL Server中执行存储过程
- 3. MS SQL Server 2008如何知道表/存储过程是否在使用?
- 4. SQL Server 2005存储过程执行
- 5. SQL Server存储过程执行差异
- 6. 从SQL Server存储过程执行Oracle存储过程
- 7. 无法执行SQL Server存储过程
- 8. 从MS Access执行SQL Server存储过程
- 9. 如何在SQL Developer中执行SQL Server存储过程?
- 10. SQL Server复制 - 存储过程执行
- 11. C#&SQL Server:执行存储过程
- 12. 从DLL执行SQL Server存储过程
- 13. PHP和SQL Server存储过程执行
- 14. 如何在SQL Server的SELECT子句中执行存储过程
- 15. 无法在休眠状态下在MS SQL Server 2008中执行远程存储过程
- 16. 如何在SQL Server中的clr存储过程中执行动态.net代码
- 17. 如何知道SQL Server 2005中哪个存储过程正在运行
- 18. 在sql松鼠中执行SQL Server存储过程
- 19. 如何在SQL Server存储过程中执行条件
- 20. 如何在SQL Server中按顺序执行存储过程
- 21. 在SQL Server的每一行执行一个存储过程表
- 22. 如何从Hibernate执行INSERT的SQL Server存储过程?
- 23. 如何对SQL Server CTE的结果执行存储过程
- 24. 使用SQL代理在SQL Server 2012中执行存储过程
- 25. 执行SQL存储过程
- 26. 在MS SQL Server中存储查询与存储过程
- 27. 不知道如何存储会话ID在SQL会话状态
- 28. 使用Python中的参数执行SQL Server存储过程
- 29. 如何使用json执行sql server存储过程?
- 30. 在sql profiler中执行存储过程
@Janis谢谢你,所以我们只能在使用SSMS执行时看到这个值。对 ? – kbvishnu 2012-07-10 14:21:08
最好的部分:不!你可以从.NET访问他们:http://stackoverflow.com/questions/765142/access-to-sql-server-messages-via-ado-net – 2012-07-10 14:25:23