Concat invoke-SqlCmd查询字符串不起作用

时间:2015-08-19 14:51:38

标签: powershell powershell-v4.0

如何将参数列表或参数字符串(更好)连接到我的sql查询?以下不起作用。

$parameters = @("-ServerInstance `"MyMachine\SQLEXPRESS`"", "-Database %TargetDbName%", "-Username %SQLUserName%", "-Password %SQLPassword%")
$row = Invoke-Sqlcmd -Query "SELECT field FROM Table;" $parameters

我想稍后使用相同的连接参数执行多个查询,并且可以在字符串中重复使用它们,我可以将它添加到查询字符串中。

2 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。听起来像是在寻找splatting

  

Splatting是一种传递参数集合的方法       作为单位的命令的值。

我不使用Invoke-SQLcmd,但它应该像这样工作:

$parameters = @{
    ServerInstance = "MyMachine\SQLEXPRESS"
    Database = "TargetDbName"
    Username = "SQLUserName"
    Password = "SQLPassword"
    Query = "SELECT field FROM Table;"
}

$row = Invoke-Sqlcmd @parameters

将所有参数收集为哈希表并展开cmdlet。如果您想稍后再次使用此参数集,但进行小的更改,现在可以通过引用哈希表的名称/值对来轻松实现。

$parameters.Query = "SELECT field FROM DifferentTable;"
$anotherRow = Invoke-Sqlcmd @parameters

答案 1 :(得分:0)

查看参数splatting

这意味着您可以将参数放入哈希表中并将哈希表作为参数传递。鉴于您的代码,您可以将其更改为。请注意,即使我将参数分配给散列表$ parameters,您也必须使用@parameter语法将其发送到cmdlet。

$parameters = @{ServerInstance="MyMachine\SQLEXPRESS";Database="$env:TargetDbName";Username="$env:SQLUserName";Password="$env:SQLPassword"}
$row = Invoke-Sqlcmd -Query "SELECT field FROM Table;" @parameters

我假设在环境变量中找到了TargetDBName,用户名和密码,所以我稍微更改了代码以获得这些代码。

试一试。