试图从对象中获取详细信息并将其保存到SQL表中。

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

队列1。上面的代码因错误而失败。删除“类型”列即可。但是有什么方法可以将Type属性转换为字符串吗?

Write-SqlTableData:找不到.Net类型'Microsoft.Azure.Commands.DataLakeStore.Models.DataLakeStoreEnums + FileType'与列'Type'的SQL类型之间的映射。
考虑删除该类型的列并重复该操作。

队列2。我还想添加一个额外的列,即RowInsertedDate,它将具有当前时间戳,而另外一个硬编码的列则是LoadStatus,其值为“Started”。如何添加选择子句?

队列3。无论如何要截断该表,然后向其中写入数据?

最佳答案

您需要对Select-Object使用计算的属性,如this answer中所述:

重新 1 ,将Type属性值转换为字符串([string]):

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

重新 2 ,添加带有时间戳的RowInsertedDate列和带有固定值LoadStatus'Started'列:
$timestamp = Get-Date
$GetFiles |
  Select-Object Name,
                @{ Name='Type'; Expression = { $_.Type.ToString() } },
                @{ Name='RowInsertedDate'; Expression = { $timestamp } },
                @{ Name='LoadStatus'; Expression = { 'Started' } }

注意:位置参数隐式绑定(bind)到-Property参数。

重新 3 ,首先截断目标表:

我无法亲自验证这一点,但我想您需要将 Invoke-SqlCmd cmdlet与
U-SQL TRUNCATE TABLE statement(因为您使用的是Azure Data Lake)。

遵循以下内容-显然,请谨慎使用,因为截断是不可逆的:
# UNTESTED. Note that TRUNCATE is IRREVERSIBLE.
Invoke-SqlCmd -Query "TRUNCATE TABLE $SQLSchema.$SQLTable" `
  -ServerInstance $SQLServer -Database $SQLDatabase -Credential $SQLCredential -Force

10-07 16:30
查看更多