T-SQL 不一致 sp_send_dbmail 结果
T-SQL inconsistent sp_send_dbmail results
我在几台服务器上设置了一份工作(都在同一个域中)。作业通过 sp_send_dbmail
发送电子邮件,电子邮件的主题应类似于以下格式:
=servername (ip address)= Weekly DB Backup to Azure Report
所以作为一个潜在的例子(显然用服务器的实际 IP 地址替换 0s SQL 是 运行ning on):
=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 服务器消息 的电子邮件,这是在未指定主题时发生的情况。每次发生这种情况时,它都可能在五台服务器中的任何一台上。我不确定发生了什么,因为它每次执行时都应该有一个主题。
编辑:
发生这种情况是因为@ipAddress 变量为空。不知道为什么
SELECT @ipAddress = local_net_address
FROM sys.dm_exec_connections
WHERE Session_id = @@SPID;
虽然 return 会为空...
如果连接未使用 TCP 传输提供程序,local_net_address 将始终为 NULL。您可能在 net_transport.
中使用了 'Shared memory'
您可以在创建连接时强制使用 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
您的@ipAddress 值可能为空
替换此代码:
+ @ipAddress +
使用此代码
+ ISNULL(@ipAddress,'0.0.0.0') +
证明这就是问题所在。
我在几台服务器上设置了一份工作(都在同一个域中)。作业通过 sp_send_dbmail
发送电子邮件,电子邮件的主题应类似于以下格式:
=servername (ip address)= Weekly DB Backup to Azure Report
所以作为一个潜在的例子(显然用服务器的实际 IP 地址替换 0s SQL 是 运行ning on):
=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 服务器消息 的电子邮件,这是在未指定主题时发生的情况。每次发生这种情况时,它都可能在五台服务器中的任何一台上。我不确定发生了什么,因为它每次执行时都应该有一个主题。
编辑: 发生这种情况是因为@ipAddress 变量为空。不知道为什么
SELECT @ipAddress = local_net_address
FROM sys.dm_exec_connections
WHERE Session_id = @@SPID;
虽然 return 会为空...
local_net_address 将始终为 NULL。您可能在 net_transport.
中使用了 'Shared memory'您可以在创建连接时强制使用 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
您的@ipAddress 值可能为空
替换此代码:
+ @ipAddress +
使用此代码
+ ISNULL(@ipAddress,'0.0.0.0') +
证明这就是问题所在。