使用Windows身份验证或SQL身份验证调用-SqlCmd

时间:2015-09-10 20:47:15

标签: sql-server powershell powershell-v3.0

此代码可以满足我的需求。但我试图使用某种交换机在同一行上用Windows身份验证或SQL身份验证替换对Invoke-SqlCmd的调用。有人可以用更优雅的方式帮助我吗?我在想Invoke-Expression但是我没有得到任何好的结果。

Function MyFunction{
    Param
    (
        [string]$S = "MyServer",
        [string]$U,
        [string]$P
    )
    # Find the SQL Engine version
    $Q = "select serverproperty('ProductVersion')"

    if($U)
    {
        $R = Invoke-Sqlcmd -ServerInstance $S -Query $Q -Username $U -Password $P -Verbose
        Write-Host "SQL Athenticated"
    }
    else
    {
        $R = Invoke-Sqlcmd -ServerInstance $S -Query $Q -Verbose
        Write-Host "Windows Athenticated"
    }
    return $R.column1
}

这是我的Invoke-Expression。它只是不起作用......

Invoke-Expression "$R = Invoke-Sqlcmd -ServerInstance $S -Query $Q $(if($true){""-Username $U -Password $P""})"

这是我正在寻找的优雅解决方案。谢谢迈克:

Function MyFunction{
    Param
    (
        [string]$S = "xps15",
        [string]$U,
        [string]$P
    )
    # Find the SQL Engine version
    $Q = "select serverproperty('ProductVersion')"
    $auth=@{}
    if($U){$auth=@{UserName=$U;Password=$P}}
    $R = Invoke-Sqlcmd -ServerInstance $S -Query $Q -Verbose @Auth
    return $R.column1
}

1 个答案:

答案 0 :(得分:10)

在我看来,这里最好的解决方案是splatting(真的)。您使用一组参数(可能为空)构建哈希表,然后使用splat运算符(@)将这些参数显示给cmdlet。:

Function MyFunction{
    Param
    (
        [string]$S = "MyServer",
        [string]$U,
        [string]$P
    )
    # Find the SQL Engine version
    $Q = "select serverproperty('ProductVersion')"

    if($U)
    {
        $auth=@{UserName=$u;Password=$p}
        Write-Host "SQL Authenticated"
    }
    else
    {
    $auth=@{}
        Write-Host "Windows Authenticated"
    }
    $R = Invoke-Sqlcmd -ServerInstance $S -Query $Q -Verbose @Auth
    return $R.column1
}

有关详细信息,请参阅get-help about_splatting