如何解决使用 PowerShell 在电子邮件中发送 sql 查询的结果
我正在尝试使用 PowerShell 通过 Azure Runbook 在电子邮件中发送 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
或者像这样将其格式化为表格或列表,然后对该输出进行字符串化:
$Body = $DataSet.Tables[0] | Format-Table -AutoSize | Out-String
这两种方法都有一些注意事项和问题,比如 HTML 表格上的默认格式非常糟糕,Format-Table
的最大宽度可能难以克服,但这种方法通常是您需要使用的.
或者,如果您的查询真正返回单行单列,您可以轻松地自己从 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 旨在仅返回结果集第一行的第一列,仅此而已。然后你可以这样做:
$SqlCmd.CommandText = $SqlQuery
try {
$SqlConnection.Open()
$SumCost = $SqlCmd.ExecuteScalar()
}
finally {
$SqlConnection.Dispose()
}
而 $SumCost
应该只是您的价值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。