Примечание. Ответ ниже может быть интересен в качестве упражнения в расширенной интерполяции строк в PowerShell , но, учитывая, что $dmvResult
содержит строки существующего объекта DataTable
, возвращенные из предыдущего запроса,использование операции массового копирования проще и намного эффективнее, как обнаружили сами Cataster : см. этот пост .
Похоже, вы пытаетесь создать инструкцию T-SQL, создав в PowerShell строку, которая включает в себя результат предыдущего запроса $dmvResult
.
Поскольку T-SQL ничего не знает о PowerShellпеременных, вам необходимо явно включить все значения , чтобы передать их INSERT INTO
в оператор string .
Вот пример, основанный на вашихпример данных с использованием мощных расширяемых строк PowerShell (интерполяция строк; для справки см. этот ответ ):
# Sample query result / imported CSV.
$dmvResult =
[pscustomobject] @{ SESSION_ID = 'D0kl8975r6df65'; SESSION_SPID = 5567 },
[pscustomobject] @{ SESSION_ID = 'fghu5r67f65'; SESSION_SPID = 2234 }
# Construct the INSERT INTO statement from $dmvResult, using an expandable
# string ("..." with $variable and $(<command> references))
$insertStatement = @"
INSERT INTO [dbo].[Table]
($($dmvResult[0].psobject.properties.name -join ', '))
VALUES
$(
@(foreach ($obj in $dmvResult) {
$values = foreach ($value in $obj.psobject.properties.value) {
if ($value -is [string]) { "`"$value`"" } else { $value }
}
'(' + ($values -join ', ') + ')'
}) -join ",`n "
)
"@
# Output the constructed statement string.
$insertStatement
Обратите внимание, чтоstringificationзначения свойств, возможно, придется сделать более сложными, в зависимости от ваших данных;Приведенный выше код различает только строковые и нестроковые: первые строковые с включением "..."
, последние как есть.
Выше приведено:
INSERT INTO [dbo].[Table]
(SESSION_ID, SESSION_SPID)
VALUES
("D0kl8975r6df65", 5567),
("fghu5r67f65", 2234)