我希望在按照here所述备份我的数据库时捕获进度消息。
它工作正常,但我担心如何从信息消息中提取完成的百分比。在评论中@ChristianHayter提出了一种特定于语言的正则表达式(在这种情况下是英语)。
sql server是否以英语发送始终的信息消息,或者是否依赖于系统设置。如果是这样,我怎么知道,progess消息的格式是什么。我想我记得sql server中的一个表,它存储了所有这些消息(类似于" {0}%完成"),但我不记得名字。
答案 0 :(得分:1)
您也可以使用
SELECT session_id as SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time
FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
如果有人从其他机器开始流程然后你可以用它来取得进展,这将非常有用。
sql server是否始终使用英语发送信息消息或是否依赖 关于系统设置。
并非总是英语。它与您在安装SQL Server管理工作室时选择的相同。您也可以通过以下方式进行更改:
答案 1 :(得分:0)
正如我在上面的评论中提到的,我想报告,如果使用消息ID工作。它确实如此,即使我假设消息ID永远不会改变。我认为这是一个有效的假设。作为我假设的第二个假设,任何语言的进度消息都将包含一个代表进度的内部编号。
比这更有效:
Private Sub _SqlConnection_InfoMessage(sender As Object, e As System.Data.SqlClient.SqlInfoMessageEventArgs) Handles _SqlConnection.InfoMessage
If _BackupInProgress Then
If e.Errors.Count > 0 Then
For Each sqlError As SqlError In e.Errors
If sqlError.Number = 3211 Then
Dim rxPercentageDone = New Regex("(\d*)")
Dim match = rxPercentageDone.Match(sqlError.Message)
If match.Success Then
' match.Groups(1).Value holds the actual progress value
Debug.Print(e.Message)
End If
End If
Next
End If
End If
End Sub
您必须订阅sql连接的InfoMessage事件。使用上面的事件处理程序,您可以捕获消息号3211的进程,并验证它包含正则表达式的进度信息。
检查语言特定的消息文本应该更加健壮。