0

我有一个数组,它遍历一个字符串,为元素赋值。如果我然后将这些元素分配给一个变量并将该变量传递给 invoke-sqlcmd 我会收到一个错误。但是,如果我将值直接分配给变量并将其传递给它,它就可以正常工作:

为数组赋值:

for ($i=0; $i -lt $somearray.length; $i++) {
    $somearray[$i] = $somearray[$i].Replace('$(query)', $query.text)
}

可以说 somearray[0] = "select * from DB"。我们将分配给一个变量:

$query = somearray[0]

现在我把它传给我的Invoke-Sqlcmd

Invoke-Sqlcmd -Query $query -Database "local" -ServerInstance "somedb" |
    Export-Csv ".\somefile.csv"

这失败了:

Invoke-Sqlcmd:找不到存储过程“从警报中选择 *”。
在 C:\Migration\ExportTool\ExportTool\Gavs.ps1:95 char:17
+ ... 调用-Sqlcmd -Query $query -Database $db -ServerInstance ...

但是,如果我这样做:

$query = "select * from DB"

Invoke-Sqlcmd -Query $query -Database "local" -ServerInstance "somedb" |
    Export-Csv ".\somefile.csv"

它完美地工作。

4

1 回答 1

0

所以原因似乎是,如果你这样做:

$query = somearray[0]

当您在 Invoke-sql 命令中查看 $query 时,它看起来像这样:

"select * from DB"

当你这样做时:

$query = "select * from DB"

它看起来像这样:

select * from DB

因此,直接引用字符串会删除 Invoke-sqlcmd 命令中的引号。看起来很奇怪。

希望这对将来的某人有所帮助。

于 2019-01-11T11:23:17.920 回答