Как сохранить результат SQL-запроса в строковой переменной Powershell?

Я использую invoke-sqlcmd для запроса базы данных в MSSMS. Это работает без проблем. У меня есть цикл, который запускает запрос X раз, и запрос возвращает код ключа, например. ТГДВС4.

Мне нужен этот код ключа в виде строки в powershell. Затем я хочу добавить строку в массив.

Единственное, что я пробовал, это использовать invoke-sqlcmd. Я видел другие примеры в сети, которые используют методы создания и закрытия соединения, но я не хочу делать это, если это возможно.

Ниже приведен код, где я нахожусь. Как добавить код клавиши (возвращенный из запроса) в массив в виде строки?

#Enter your confirmation numbers here;
$confArray = @(
'0000000090519838',
'0000000090059392'
)

$resultArray = @()

#Function that runs for each element in the above array
function getKeycode ($confNumber) {


$QueryFmt= "
select distinct top 100       
aa.deliveryKeycode as 'Keycode'
from appointment a with (nolock)
left join appointmentattribute aa with (nolock) on aa.appointmentid = a.appointmentid
where
a.confirmationnumber in (

'"+ $confNumber + "'

)
"

$result = Invoke-Sqlcmd -ServerInstance myserver -Database mydatabase  -Query $QueryFmt

$resultArray.Add($result)

}


#the for loop
foreach($con in $confArray){

getKeycode -confNumber $con
$count ++;

}

person Cormac    schedule 02.07.2019    source источник


Ответы (2)


Я думаю, просто вернув ваш массив из вашей функции:

  # ...
  $result = Invoke-Sqlcmd -ServerInstance myserver -Database mydatabase -Query $QueryFmt 
  $resultArray.Add($result) 

  return $resultArray
}
person JKoopman    schedule 02.07.2019
comment
Я думал, что, поскольку массив объявлен вне функции, когда я изменяю его внутри функции, его не нужно возвращать. - person Cormac; 02.07.2019

Запись в массив в родительской области из вашей функции немного анти-шаблон, я бы настоятельно не советовал этого делать.

Просто return Invoke-SqlCmd ... напрямую:

function Get-Keycode ([int]$confNumber) {

  $QueryFmt= "
  select distinct top 100       
  aa.deliveryKeycode as 'Keycode'
  from appointment a with (nolock)
  left join appointmentattribute aa with (nolock) on aa.appointmentid = a.appointmentid
  where
  a.confirmationnumber in (
    '"+ $confNumber + "'
  )"

  return Invoke-Sqlcmd -ServerInstance myserver -Database mydatabase  -Query $QueryFmt

}


# Assign the output of the foreach loop to `$KeyCodes`
$KeyCodes = foreach($con in $confArray){
  Get-Keycode -confNumber $con
  $count++
}
person Mathias R. Jessen    schedule 02.07.2019
comment
Спасибо за ваш ответ - как мне обойти получение System.Data.DataRow в качестве ответа - при использовании Write-Host $KeyCodes - person Cormac; 02.07.2019
comment
Перечисление свойств поддержки DataRow, поэтому я бы сделал $KeyCodes.Keycode - person Mathias R. Jessen; 02.07.2019