使用 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
应该就是您的值。
我正在尝试通过 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
应该就是您的值。