2016-06-10 41 views
0

我編寫了以下PowerShell腳本來運行SP列表。當我運行它時,在第一次運行後沒有給出正確的結果,但是當我單獨運行它們時,所有它們都作爲第一次運行。PowerShell運行陣列中的存儲過程

$Sps = "test_sp_HasPaidOrder", 
     "test_sp_HasPaidBKMOrder", 
     "test_sp_HasPaidCreditCardOrder" 

foreach ($sp in $Sps) 
{ 
    $sp_name = $sp 
    echo "- - - $sp_name - - - " 
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
    $SqlConnection.ConnectionString = "Server=server_adres;Database=db_name;Integrated Security=True" 
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
    $SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure 
    $SqlCmd.CommandText = $sp_name 
    $SqlCmd.Connection = $SqlConnection 
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
    $SqlAdapter.SelectCommand = $SqlCmd 
    $DataSet = New-Object System.Data.DataSet 
    $SqlAdapter.Fill($DataSet) 
    $SqlConnection.Close() 
    $DataSet.Tables 
} 

結果:

PS C:\Users\mesut.gunes\Documents\scripts> .\run_sp1.ps1 
- - - test_sp_HasPaidOrder - - - 
1 

HasPaidOrder 
------------ 
True 
- - - test_sp_HasPaidBKMOrder - - - 
1 

- - - test_sp_HasPaidCreditCardOrder - - - 
1 

我也試過$SqlAdapter.Fill($DataSet)之後添加Start-Sleep -s 3處理並行執行,但不解決它。如何解決這個問題?

+0

我沒有SQL環境來測試這個。但是,您可以嘗試使用「工作流{ForEach -Parallel(...){...}}」。你可以參考這個鏈接的更多細節:[ForEach並行](https://technet.microsoft.com/en-us/library/jj713711.aspx) – SavindraSingh

+0

@SavindraSingh它不需要平行,我只是想得到PS的結果。 –

+1

恕我直言,它看起來像格式問題。試試'$ DataSet.Tables | OUT-Default'。 – PetSerAl

回答

1

當輸出具有不同屬性集的多個對象時,PowerShell存在一些問題:只有第一個對象的屬性用於確定表格格式的列標題。

PS> $a = 
>>>  [PSCustomObject]@{a=1;b=2}, 
>>>  [PSCustomObject]@{b=2;c=3}, 
>>>  [PSCustomObject]@{c=3;d=4}, 
>>>  [PSCustomObject]@{d=4;e=5}, 
>>>  [PSCustomObject]@{e=5;f=6} 
PS> function f {$a;$a} 
PS> f 

a b 
- - 
1 2 
    2 



1 2 
    2 





PS> 

因此,當後面的對象與第一個對象沒有任何共同的屬性時,將導致打印空行。

有多種方式來解決這個問題:要打印

  • 明確指定列:

    PS> f | ft a,b,c,d,e,f 
    
    a b c d e f 
    - - - - - - 
    1 2 
        2 3 
        3 4 
         4 5 
         5 6 
    1 2 
        2 3 
        3 4 
         4 5 
         5 6 
    
    
    PS> 
    
  • 使用列表格式:

    PS> f | fl 
    
    
    a : 1 
    b : 2 
    
    b : 2 
    c : 3 
    
    c : 3 
    d : 4 
    
    d : 4 
    e : 5 
    
    e : 5 
    f : 6 
    
    a : 1 
    b : 2 
    
    b : 2 
    c : 3 
    
    c : 3 
    d : 4 
    
    d : 4 
    e : 5 
    
    e : 5 
    f : 6 
    
    
    
    PS> 
    
  • 或者你可以修改函數f來管道每個單獨的對象獨立實例的Out-Default命令。請注意,在這種情況下,對象是打印在主機上(或其他任何Out-Default決定做的),並且不會成爲函數結果的一部分,因此您無法通過管道進一步處理對象。

    PS> function f {$a | % {$_ | Out-Default}; $a | % {$_ | Out-Default}} 
    PS> f | Out-Null 
    
    a b 
    - - 
    1 2 
    
    
    
    b c 
    - - 
    2 3 
    
    
    
    c d 
    - - 
    3 4 
    
    
    
    d e 
    - - 
    4 5 
    
    
    
    e f 
    - - 
    5 6 
    
    
    
    a b 
    - - 
    1 2 
    
    
    
    b c 
    - - 
    2 3 
    
    
    
    c d 
    - - 
    3 4 
    
    
    
    d e 
    - - 
    4 5 
    
    
    
    e f 
    - - 
    5 6 
    
    
    PS> 
    

    注意,這Out-Null不會忽略輸出功能,因爲功能並沒有真正有輸出它只是打印上主機的東西。

+0

感謝您的定義。 –