PowerShell在数组中运行存储过程

时间:2016-06-10 14:21:48

标签: sql-server powershell stored-procedures

我编写了以下PowerShell脚本来运行SP列表。当我运行它时,在第一个之后没有给出正确的结果,但是当我单独运行它们时,所有它们都作为第一个运行。

$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

我还尝试在Start-Sleep -s 3之后添加$SqlAdapter.Fill($DataSet)来处理并行执行但不修复它。怎么解决这个问题?

1 个答案:

答案 0 :(得分: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不会忽略函数输出,因为函数实际上没有输出它只是在主机上打印一些东西。