使用 PowerShell 在电子邮件中发送 sql 查询的结果

Send result of sql query in email using PowerShell

我正在尝试通过 Azure Runbook 使用 PowerShell 在电子邮件中发送 av SQL 查询的结果。 SQL 查询有效,结果打印到控制台,但不会打印在电子邮件中。相反,我在电子邮件“System.Data.DataRow”中收到以下文本。与我的数据库的连接工作正常,它输出到控制台只是不在电子邮件中打印。

这是我目前的情况:

$SqlQuery = "SELECT
          SUM([Cost]) AS [Sum Cost]
      FROM [dbo].[TestData]
      ;"

$DataSet = New-Object System.Data.DataSet
    $SqlCmd.CommandText = $SqlQuery
    $SqlAdapter.Fill($DataSet)  
    $DataSet.Tables[0]

Send-MailMessage -From "me@gmail.com" -To "you@gmail.com" -Subject "Sum cost" -Body "This is the Sum Cost: $($DataSet.Tables[0])" -SmtpServer mail.net -Credential $Cred -Port $Eport

问题是系统中没有定义将 DataTable 转换为字符串的方法。这意味着你必须这样做。

你可以这样做:

$Body = $DataSet.Tables[0] | ConvertTo-Html -As Table

或类似这样的东西将其格式化为 table 或列表,然后将该输出字符串化:

$Body = $DataSet.Tables[0] | Format-Table -AutoSize | Out-String

这两种方法都有一些注意事项和问题,比如 HTML table 的默认格式非常糟糕,Format-Table 的最大宽度很难克服,不过这个方法一般是你需要用到的。


或者,如果您的查询确实 return 是单行单列,您可以轻松地自己将数据从 DataSet 中提取出来:

$SumCost =  $DataSet.Tables[0].Rows[0].'Sum Cost'

Send-MailMessage -From "me@gmail.com" -To "you@gmail.com" -Subject "Sum cost" -Body "This is the Sum Cost: $SumCost" -SmtpServer mail.net -Credential $Cred -Port $Eport

或者,如果真的那么简单,您可以 use SqlCommand.ExecuteScalar 而不是完全弄乱 DataSet 和 DataAdapter。 ExecuteScalar 旨在仅 return 结果集第一行的第一列,仅此而已。那么你可以这样做:

$SqlCmd.CommandText = $SqlQuery

try {
    $SqlConnection.Open()
    $SumCost = $SqlCmd.ExecuteScalar()
}
finally {
    $SqlConnection.Dispose()
}

并且 $SumCost 应该就是您的值。