sql server中的信息消息是否已本地化?

时间:2015-12-29 07:13:02

标签: c# .net sql-server

我希望在按照here所述备份我的数据库时捕获进度消息。

它工作正常,但我担心如何从信息消息中提取完成的百分比。在评论中@ChristianHayter提出了一种特定于语言的正则表达式(在这种情况下是英语)。

sql server是否以英语发送始终的信息消息,或者是否依赖于系统设置。如果是这样,我怎么知道,progess消息的格式是什么。我想我记得sql server中的一个表,它存储了所有这些消息(类似于" {0}%完成"),但我不记得名字。

2 个答案:

答案 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管理工作室时选择的相同。您也可以通过以下方式进行更改:

enter image description here

同时检查Local Language Versions in 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的进程,并验证它包含正则表达式的进度信息。

检查语言特定的消息文本应该更加健壮。