根据SQL结果从Powershell发送电子邮件

时间:2017-05-29 03:46:09

标签: sql-server powershell

新手。我有一个平面文件,我想在PowerShell脚本中查询字符串(例如SQL:SELECT * FROM '[LOGFILEPATH]' WHERE Field1 LIKE '%LOGIN%'),如果查询返回任何行,PS脚本应该发送一封电子邮件。我稍后会添加其他功能,但现在我需要知道如何将结果传递给PS并相应地发送电子邮件。感谢。

2 个答案:

答案 0 :(得分:0)

如果配置了DBMail,您可以从Sql Server本身发送邮件。过程sp_send_dbmail可以将查询结果作为附件发送。像这样,

declare @mailTo varchar(64) = 'valid@address.he.re';
declare @subj varchar(64) = 'Subject for message';
declare @fName varchar(64) = concat('QueryResults-', convert(varchar(10), getdate(), 120), '.txt');
exec msdb.dbo.sp_send_dbmail
@recipients = @mailTo,
@subject = @subj,
@query = N'select top(10) column1, column2 from [MyDatabase].[dbo].[SomeTable];',
@attach_query_result_as_file = 1,
@query_attachment_filename = @fName;

这种方法的主要限制是,即使没有结果,它也会向您发送一封邮件。要克服这个问题,请考虑添加if块。像这样,

declare @cnt int = 0;
set @cnt = (select count(column1) from table where <some conditions apply>);
if @cnt <> 0
begin
    exec msdb.dbo.sp_send_dbmail ...
end

答案 1 :(得分:0)

您可以使用Invoke-SqlCmd2检查表格,然后使用Send-MailMessage发送邮件。 如果你想在不使用Invoke-SqlCmd2的情况下自己编写它,你可以这样做:

$server   = 'localhost\sqlexpress'
$database = 'MyDB'
$query    = "SELECT * FROM '[LOGFILEPATH]' WHERE Field1 LIKE '%LOGIN%'"

$connection = New-Object -TypeName System.Data.SqlClient.SqlConnection
$dataset = New-Object -TypeName System.Data.DataSet
$connection.ConnectionString = "Server=$server;Database=$database;Trusted_Connection=True;"
$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText = $query
$adapter = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter $command
$rowCount = $adapter.Fill($dataset)

if ($rowCount -gt 0) {
    Send-MailMessage ...
}

最后填写Send-MailMessage所需的详细信息。

相关问题