考虑以下存储过程..
CREATE PROCEDURE SlowCleanUp (@MaxDate DATETIME)
AS
BEGIN
PRINT 'Deleting old data Part 1/3...'
DELETE FROM HugeTable1 where SaveDate < @MaxDate
PRINT 'Deleting old data Part 2/3...'
DELETE FROM HugeTable2 where SaveDate < @MaxDate
PRINT 'Deleting old data Part 3/3...'
DELETE FROM HugeTable3 where SaveDate < @MaxDate
PRINT 'Deleting old data COMPLETED.'
END
假设每个delete语句需要很长时间才能删除,但我喜欢在SQL Management Studio中运行它时看到此存储过程的进度。换句话说,我喜欢看PRINT语句的输出,看看我在任何给定时间的位置。但是,我似乎只能在ENTIRE运行结束时看到PRINT输出。有没有办法让它能够实时看到PRINT输出?如果没有,还有其他方法可以看到正在运行的存储过程的进度吗?
答案 0 :(得分:32)
如果您使用严重性为10或更低的RAISERROR
并使用NOWAIT
选项,它会立即向客户发送信息性消息:
RAISERROR ('Deleting old data Part 1/3' , 0, 1) WITH NOWAIT
答案 1 :(得分:6)
是的,如果您使用RAISERROR:
,您应该可以立即打印消息 RAISERROR('Hello',10,1) WITH NOWAIT
答案 2 :(得分:0)
我发现了一种很好的非侵入式方式来查看存储过程的运行进度。使用我在SP_WHO2的Stackoverflow上找到的代码,您可以看到第一列包含当前正在从PROC运行的当前代码。每次您重新运行此SP_Who2进程时,它将显示当时正在运行的代码。这将使您随时知道proc的运行距离。这是我修改的sp_who2代码,以便更轻松地跟踪进度:
Declare @loginame sysname = null
DECLARE @whotbl TABLE
(
SPID INT NULL
,Status VARCHAR(50) NULL
,Login SYSNAME NULL
,HostName SYSNAME NULL
,BlkBy VARCHAR(5) NULL
,DBName SYSNAME NULL
,Command VARCHAR(1000) NULL
,CPUTime INT NULL
,DiskIO INT NULL
,LastBatch VARCHAR(50) NULL
,ProgramName VARCHAR(200) NULL
,SPID2 INT NULL
,RequestID INT NULL
)
INSERT INTO @whotbl
EXEC sp_who2 @loginame = @loginame
SELECT CommandText = sql.text ,
W.*
,ExecutionPlan = pln.query_plan
,ObjectName = so.name
,der.percent_complete
,der.estimated_completion_time
--,CommandType =der.command
FROM @whotbl W
LEFT JOIN sys.dm_exec_requests der
ON der.session_id = w.SPID
OUTER APPLY SYS.dm_exec_sql_text (der.sql_handle) Sql
OUTER APPLY sys.dm_exec_query_plan (der.plan_handle) pln
LEFT JOIN sys.objects so
我希望我还记得谁是我的原始代码,但是它对您有很大帮助。如果我需要终止进程,它还会标识SPID。