Передайте переменную powershell в значение SQL во время out-datatable (invoke-sqlcmd2)

Я хочу вставить значение переменной PowerShell с помощью Select, когда я создаю таблицу данных из запроса SQL.

Заимствованная функция invoke-sqlcmd2 из галереи TechNet и добавленная в нее точка.

$NewSequenceID = invoke-sqlcmd2 -ServerInstance "MyServer" -Database "MyDB" -Query "INSERT INTO [Sequence] (TimeStarted) SELECT GETDATE(); SELECT max(SequenceID) as SequenceID FROM [Sequence]" | foreach { $_.SequenceID }

Это генерирует новый идентификатор последовательности и отмечает время, когда мы начали пакет. В результате получается одно число, которое идентифицирует этот запуск. Проверено с помощью «написать $NewSequenceID». Я хочу сохранить более поздние результаты запросов вместе с этим SequenceID для анализа.

Тогда у меня есть это:

$PollTime = Get-Date -format "yyyy-MM-dd HH:mm:ss"

Затем я хочу сделать это: (Редактировать: этот оператор не работает - сообщение об ошибке внизу)

$AuditUserOutput = invoke-sqlcmd2 -ServerInstance "MyServer2" -Database "MyDB2" -Query "SELECT $NewSequenceID, $PollTime, [USERID], [PID], [UDATE] FROM [MyTable]"  -As 'Datatable'

И сделайте что-нибудь с таблицей, а затем напишите ее с помощью write-datatable.

Если я выберу NULL для первых двух значений и возьму остальные три из существующей таблицы, все будет работать нормально. Я хочу добавить $NewSequenceID и $PollTime из предыдущих операторов.

Я прочитал дюжину страниц об использовании ` (обратная кавычка), $, {} и так далее и тому подобное, но я не понял правильно. Может ли кто-нибудь помочь с правильным синтаксисом для вставки этих значений переменных в выборку?

PS Ошибка: исключение, вызывающее «Заполнить» с аргументом (ами) «1»: «Неверный псевдостолбец «$ NewSequenceID».»


person apyo    schedule 30.07.2013    source источник
comment
Как/где вы хотите добавить эти переменные? Вам нужно показать нам свой нерабочий код. В рабочем коде нечего исправлять.   -  person Ansgar Wiechers    schedule 31.07.2013
comment
Э-э, $NewSequenceID и $PollTime должны быть именами столбцов в таблице или значениями для поиска? Как называются столбцы?   -  person Adi Inbar    schedule 31.07.2013
comment
Пытался объяснить с помощью первых двух рабочих операторов, как я получаю значения, которые хочу использовать в третьем операторе, который не работает. Где я разместил SELECT $NewSequenceID, $PollTime,... Это не работает. @AdiInbar - они должны быть значениями и будут одинаковыми для каждой строки.   -  person apyo    schedule 31.07.2013
comment
@AnsgarWiechers - я хочу использовать эти значения в операторе Select для заполнения двух полей. Затем я получаю остальные три [USERID], [PID], [UDATE] FROM [MyTable], чтобы завершить окончательную таблицу данных.   -  person apyo    schedule 31.07.2013
comment
Если я заменю «1» и getdate() для этих двух переменных в одном операторе, он будет работать нормально и строит таблицу, как и ожидалось. Я хочу использовать то, что хранится в $NewSequenceID и $PollTime, вместо фиксированных значений.   -  person apyo    schedule 31.07.2013
comment
Не описывайте то, что, по вашему мнению, вы делаете. Показать код и точное сообщение об ошибке.   -  person Ansgar Wiechers    schedule 31.07.2013
comment
Спасибо за вклад в это. Я смог обойти это, сначала создав переменную для хранения текста запроса, что позволило использовать естественную замену, которая мне нужна: $AuditUserQuery = SELECT '$NewSequenceID', '$PollTime', [USERID], [PID], [ UDATE] FROM [AUDITUSER] Затем вызов этой переменной в качестве запроса при построении таблицы данных: $AuditUserOutput = invoke-sqlcmd2 -ServerInstance MyServer2 -Database MyDB2 -Query $AuditUserQuery -As 'Datatable' Это позволило избежать проблемы параметризации внутри invoke-sqlcmd2.   -  person apyo    schedule 31.07.2013


Ответы (2)


Вы правильно интерполируете переменные в PowerShell. Если я правильно понимаю, проблема в вашем SQL-запросе. Я собираюсь сделать вывод здесь, но я думаю, что это, вероятно, то, что вы хотите:

$AuditUserOutput = invoke-sqlcmd2 -ServerInstance "MyServer2" -Database "MyDB2" -Query "SELECT [NewSequenceID], [PollTime], [USERID], [PID], [UDATE] FROM [MyTable] WHERE NewSequenceID = '$NewSequenceID' AND PollTime = '$PollTime'"  -As 'Datatable'

Если нет, уточните, ответив на вопросы выше.

person Adi Inbar    schedule 30.07.2013
comment
Нет, этих столбцов еще не существует. Где будет полагаться на то, что эти столбцы будут найдены в MyTable, а это не так. Извините, это сбивает с толку. Общая картина такова, что мне нужно знать, как использовать значение переменной powershell внутри оператора выбора или вставки SQL. Вероятно, было бы разумнее, если бы я сказал, что хочу вставить значение в существующий столбец. Тот же самый синтаксис должен решить эту проблему. В данном случае я просто еще не создал финальную таблицу. Я создаю переменную $dt Datatable, чтобы сначала немного поработать. - person apyo; 31.07.2013
comment
Я смог обойти эту проблему, сначала создав переменную для хранения текста запроса, которая позволяла использовать необходимую мне естественную замену: $AuditUserQuery = SELECT '$NewSequenceID', '$PollTime', [USERID], [PID], [ UDATE] FROM [AUDITUSER] Затем вызов этой переменной в качестве запроса при построении таблицы данных - person apyo; 31.07.2013

Я смог обойти это, сначала создав переменную для хранения текста запроса, что позволило использовать естественную замену, в которой я нуждался:

$AuditUserQuery = "SELECT '$NewSequenceID', '$PollTime', [USERID], [PID], [UDATE] FROM [AUDITUSER]" 

Затем вызовите эту переменную как $query при построении таблицы данных.

Это позволило избежать проблем с параметризацией, которые возникали раньше.

person apyo    schedule 01.08.2013