1

我在几台服务器(都在同一个域中)上设置了一份工作。作业通过 发送电子邮件sp_send_dbmail,电子邮件的主题应类似于以下格式:

=servername (ip address)= Weekly DB Backup to Azure Report

因此,作为一个潜在的示例(显然将 0 替换为运行 SQL 的服务器的实际 IP 地址):

=SQLMACHINE (000.000.000.00)= Weekly Backup to Azure Report

DBmail 已配置,我创建了备份作业。发送电子邮件的 T-SQL 作业步骤具有以下脚本:

SET NOCOUNT ON
DECLARE @ipAddress NVARCHAR(100) 

SELECT @ipAddress = local_net_address 
FROM sys.dm_exec_connections 
WHERE Session_id = @@SPID;

DECLARE @subjectText NVARCHAR(255) = N'=' + 
    CAST(LEFT(@@SERVERNAME, CHARINDEX('\', @@SERVERNAME)-1) AS NVARCHAR) + N'.' + 
    CAST(DEFAULT_DOMAIN() AS NVARCHAR) + N' ('+ @ipAddress + 
    N')= Weekly DB Backup to Azure Report'

DECLARE @tableHTML NVARCHAR(MAX) = N'this part works fine'

exec msdb.dbo.sp_send_dbmail @profile_name = 'Production Mail',
                             @recipients = 'xxx@xxx.com',
                             @subject = @subjectText,
                             @body = @tableHTML,
                             @body_format = 'HTML'

5 台服务器中的每台都具有完全相同的作业定义 - 我有 1 个作业的源代码控制定义,用于在每台服务器上创建作业。

每周工作时,他们中的大多数人都会启动一封带有预期主题的电子邮件。但是,每隔几周,就会收到一封带有主题SQL Server Message的电子邮件,这是在未指定主题时发生的情况。每次发生这种情况时,它都可能在五台服务器中的任何一台上。我不确定发生了什么,因为它每次执行时都应该有一个主题。

编辑: 这是因为 @ipAddress 变量为空。不知道为什么

SELECT @ipAddress = local_net_address 
FROM sys.dm_exec_connections 
WHERE Session_id = @@SPID;

虽然会返回 null ......

4

2 回答 2

1

如果连接未使用 TCP 传输提供程序,local_net_address 将始终为 NULL。您可能在 net_transport 中使用了“共享内存”。

您可以在创建连接时强制使用 TCP,因此将填充 local_net_address。例如,当您打开 SSMS 时,您可以将服务器名称指定为“tcp:ServerName\InstanceName”

下面也可用于检索服务器属性(使用 TCP 传输):

SELECT  
   CONNECTIONPROPERTY('net_transport') AS net_transport,
   CONNECTIONPROPERTY('protocol_type') AS protocol_type,
   CONNECTIONPROPERTY('auth_scheme') AS auth_scheme,
   CONNECTIONPROPERTY('local_net_address') AS local_net_address,
   CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
   CONNECTIONPROPERTY('client_net_address') AS client_net_address 
于 2016-09-12T23:31:07.703 回答
0

您的 @ipAddress 值可能为空

替换此代码:

 + @ipAddress +

使用此代码

+ ISNULL(@ipAddress,'0.0.0.0') +

证明这是问题所在。

于 2016-09-13T12:38:35.187 回答