2015-11-06 123 views
1

在PowerShell中,我試圖觸發一個電子郵件發送,只有當有一個SQL查詢的結果。電子郵件功能和數據庫連接工作正常,但基於SQL結果的「if then」語句不起作用 - 我不認爲$ result = [bool]是有效的。Powershell - 如果SQL查詢返回一個結果,然後運行功能

如果從SQL語句返回任何記錄,並且電子郵件將包含SQL結果,最終結果將是僅發送的電子郵件。

這是我到目前爲止有:

$result = [bool](" 
       SELECT * 
       FROM table 
       WHERE condition") 

If ($result -eq $true) { 

function Invoke-SQL ($dataset) { 

    $connectionString = "server=servername;uid=valuehere;pwd=passwordhere;database=dbnamehere;" 
    $sqlCommand = " 
       SELECT * 
       FROM table 
       WHERE condition" 
        " 

    $connection = new-object system.data.SqlClient.SQLConnection($connectionString) 
    $command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection) 
    $connection.Open() 

    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command 
    $adapter.Fill($dataSet) #| Out-Null 

    $connection.Close() 

} 


function Invoke-Email ($dataset) { 
    foreach ($Row in $dataset.Tables[0].Rows) 
    { 
     write-host "value is : $($Row[0])" 
    } 

    $From = "email" 
    $To = "email" 
    $Subject = "subject here" 
    $Body = echo 'email body here' $dataset.tables[ 0 ] | Out-String 
    $SMTPServer = "server here" 


    Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer 
    #-Port $Port 

} 

$dataset = New-Object System.Data.DataSet 

Invoke-SQL $dataset 
$dataset.Tables 
Invoke-Email $dataset 
$result 

回答

1

至少有兩件事情,你可以做根據您當前的執行查詢的方法來做到這一點。對於使用dataAdapter的'fill'方法執行的簡單SELECT查詢,返回值應該是查詢返回的行數。你可以這樣做:

$resultCount = $adapter.fill($dataSet) 

然後,只需檢查$ RESULTCOUNT個大於0

if($resultCount -gt 0){ 
    #invoke your email function here 
} 

你也可以只查看數據表這樣的行數:

$dataSet.Tables[your table name or index].Rows.Count 

再次簡單檢查是否大於0.

if($dataSet.Tables[your table name or index].Rows.Count -gt 0){ 
    #invoke your email function here 
} 

我建議使用第二種方法來計算數據表中的行數,因爲您不必擔心可用的不同數據適配器對象的差異。

+1

請注意,這隻適用於返回行的語句。 – emanresu