我有一个数组,它循环遍历一个字符串,为元素赋值。如果我然后将这些元素分配给一个变量并将该变量传递到 invoke-sqlcmd 中,则会出现错误。但是,如果我将值直接分配给变量并将其传入,则可以正常工作:
为数组赋值:
for ($i=0; $i -lt $somearray.length; $i++) {
$somearray[$i] = $somearray[$i].Replace('$(query)', $query.text)
}
假设 somearray[0] = "从数据库中选择 *"。我们将分配给一个变量:
$query = somearray[0]
现在我把它传递给我的Invoke-Sqlcmd
:
Invoke-Sqlcmd -Query $query -Database "local" -ServerInstance "somedb" |
Export-Csv ".somefile.csv"
此操作失败:
Invoke-Sqlcmd : 找不到存储过程"从警报中选择 *"。at C:\Migration\ExportTool\ExportTool\Gavs.ps1:95 char:17+ ... Invoke-sqlcmd -query $query -database $db -ServerInstance ...
但是,如果我这样做:
$query = "select * from DB"
Invoke-Sqlcmd -Query $query -Database "local" -ServerInstance "somedb" |
Export-Csv ".somefile.csv"
它完美地工作。
所以原因似乎是,如果你这样做:
$query = somearray[0]
在 Invoke-sql 命令中查看$query时,它如下所示:
"select * from DB"
当你这样做时:
$query = "select * from DB"
它看起来像这样:
select * from DB
因此,直接引用字符串会删除 Invoke-sqlcmd 命令中的引号。似乎很奇怪。
希望这对将来的某人有所帮助。