【问题标题】:Use of Select-Object to change a property's data type and to add calculated properties使用 Select-Object 更改属性的数据类型并添加计算属性
【发布时间】:2020-07-06 00:00:50
【问题描述】:

试图从对象中获取详细信息并希望将其保存到 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。无论如何要截断这个表然后将数据写入它?

【问题讨论】:

    标签: azure powershell azure-powershell azure-data-lake select-object


    【解决方案1】:

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

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

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

    关于2,添加一个带有时间戳的RowInsertedDate列,以及一个带有固定值'Started'LoadStatus列:

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

    注意:位置参数隐式绑定到-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
    

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 2017-04-13
      • 2023-03-11
      • 2019-06-06
      • 2018-10-09
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多