1

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

4

1 回答 1

3

您需要将计算属性与 一起使用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参数。


Re 3,先截断目标表:

我无法亲自验证这一点,但我认为您需要将Invoke-SqlCmdcmdlet 与
U-SQLTRUNCATE TABLE语句一起使用(因为您使用的是 Azure Data Lake)。

类似于以下内容 - 显然,请谨慎使用,因为截断是不可逆的:

# UNTESTED. Note that TRUNCATE is IRREVERSIBLE.
Invoke-SqlCmd -Query "TRUNCATE TABLE $SQLSchema.$SQLTable" `
  -ServerInstance $SQLServer -Database $SQLDatabase -Credential $SQLCredential -Force
于 2020-03-25T13:14:20.583 回答