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

Concat invoke-SqlCmd query string does not work

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

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

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

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

Splatting is a method of passing a collection of parameter values to a command as unit.

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

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

$row = Invoke-Sqlcmd @parameters

将所有参数收集为哈希表并展开 cmdlet。如果您想稍后再次使用此参数集,但要进行一些小的更改,现在通过引用哈希表的 name/value 对就很容易了。

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

查看参数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、用户名和密码,所以我稍微更改了代码以获取它们。

试一试。