Новичок . У меня есть плоский файл, который я хочу выполнить SQL-запросом для строки из скрипта PowerShell (пример SQL: SELECT * FROM '[LOGFILEPATH]' WHERE Field1 LIKE '%LOGIN%'), и если запрос возвращает какие-либо строки, скрипт PS должен отправить электронное письмо. У меня будут другие функции, которые я добавлю позже, но сейчас мне нужно знать, как передать результат в PS и соответственно отправить электронное письмо. Спасибо.

-2
AlanGrant 29 Май 2017 в 06:46

2 ответа

Лучший ответ

Вы можете отправлять почту с самого сервера Sql, если настроен DBMail. Процедура 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
0
vonPryz 29 Май 2017 в 06:15

Вы можете использовать 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.

0
HanShotFirst 29 Май 2017 в 13:54