Использование Select-Object для изменения типа данных свойства и добавления вычисляемых свойств

Пытаюсь получить информацию об объекте и хочу сохранить его в таблицу SQL.

$GetFiles `
    | Select-Object -Property  Name, Type `
    | Write-SqlTableData -ServerInstance $SQLServer -DatabaseName $SQLDatabase -SchemaName $SQLSchema -TableName $SQLTable -Credential $SQLCredential -Force

Que.1. Приведенный выше код завершается с ошибкой. Удаление столбца «Тип» работает. Но есть ли способ привести свойство Type к строке?

Write-SqlTableData: сопоставление между типом .Net «Microsoft.Azure.Commands.DataLakeStore.Models.DataLakeStoreEnums+FileType» и типом SQL для столбца «Type» не найдено. Рассмотрите возможность удаления столбца с этим типом и повторите операцию.

Que.2. Я также хочу добавить дополнительный столбец, скажем, RowInsertedDate, который будет иметь текущую временную метку, и еще один жестко запрограммированный столбец, скажем, LoadStatus со значением «Started». Как добавить предложение select?

Que.3. В любом случае, чтобы обрезать эту таблицу, а затем записать в нее данные?


person SomeGuy    schedule 25.03.2020    source источник


Ответы (1)


Вам нужно использовать вычисленные свойства с Select-Object, как описано в этом ответе:

Re 1, преобразование значений свойства Type в строки ([string]):

$GetFiles |
  Select-Object -Property Name, @{ Name='Type'; Expression = { [string] $_.Type } }

Re 2, добавление столбца RowInsertedDate с отметкой времени и столбца LoadStatus с фиксированным значением 'Started':

$timestamp = Get-Date
$GetFiles |
  Select-Object Name, 
                @{ Name='Type'; Expression = { $_.Type.ToString() } },
                @{ Name='RowInsertedDate'; Expression = { $timestamp } },
                @{ Name='LoadStatus'; Expression = { 'Started' } }

Примечание. Позиционные аргументы неявно связываются с параметром -Property.


Относительно 3, сначала усекая целевую таблицу:

Я не могу лично проверить это, но полагаю, вам нужно использовать Invoke-SqlCmd с
оператор U-SQL TRUNCATE TABLE (поскольку вы используете Azure Data Lake).

Что-то вроде следующих строк — очевидно, соблюдайте осторожность, потому что усечение необратимо:

# UNTESTED. Note that TRUNCATE is IRREVERSIBLE.
Invoke-SqlCmd -Query "TRUNCATE TABLE $SQLSchema.$SQLTable" `
  -ServerInstance $SQLServer -Database $SQLDatabase -Credential $SQLCredential -Force
person mklement0    schedule 25.03.2020