【问题标题】:Send result of sql query in email using PowerShell使用 PowerShell 在电子邮件中发送 sql 查询的结果
【发布时间】:2021-03-11 02:13:11
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: powershell email azure-runbook


    【解决方案1】:

    问题在于系统中没有定义将 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 应该是你的价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多