【问题标题】:Rename a file column name in Azure Synapse在 Azure Synapse 中重命名文件列名称
【发布时间】:2021-10-26 21:06:33
【问题描述】:

我有一个命名约定很差的文件,我想在使用 Azure Synapse 之前对其进行清理。是否可以重命名with 块中的列?

SELECT TOP 10 *
FROM OPENROWSET(
    BULK 'path_to_file.csv'
    FORMAT = 'CSV'
    PARSER_VERSION = '2.0'
    FIRSTROW = 2)
    WITH (
        [ORDER ID] varchar(50)
    ) as rows

我可以在 select 中使用别名,但希望在此之前清理它。

SELECT [ORDER ID] as order_id

我可以将它包装在一个视图中 - 只是希望有一种方法可以更早地重命名。

【问题讨论】:

  • 假设您不想在管道中使用数据流来重现具有良好标题的文件,我认为您坚持使用 SELECT ... AS ... 方法。我认为如果您使用 FIRSTROW = 2 而不是 HEADER_ROW = TRUE(如本例所示),列名实际上是 C1、C2、C3 等。

标签: azure azure-synapse


【解决方案1】:

是的,可以重命名WITH 块中的列;您在此处提供的名称将覆盖从文件中读取的列名称(即使 HEADER_ROW 设置为 TRUE

但有一个警告。您必须为您的所有列提供名称:

    SELECT TOP 10  *  
    FROM OPENROWSET
    (BULK 'path_to_file.csv',  
        FORMAT = 'CSV',
        PARSER_VERSION = '2.0',
        HEADER_ROW = true)
    WITH
    (   
        your_column_name_1 varchar(50)
        ...
        your_column_name_N varchar(50)
    ) 
    AS rows

...或选择您想要保留和/或使用它们的序数编号重命名:

    SELECT TOP 10  *  
    FROM OPENROWSET
    (BULK 'path_to_file.csv',  
        FORMAT = 'CSV',
        PARSER_VERSION = '2.0',
        HEADER_ROW = true)
    WITH
    (   
        your_column_name_1 varchar(50) 1
        your_column_name_4 varchar(50) 4
    ) 
    AS rows

【讨论】:

  • 我认为列名覆盖仅在您指定第一个序数时才有效?否则,我会返回 NULL。所以看起来,如果你指定一个不存在的列名并且不使用序数,你会得到一个 NULL。所以我认为你的第一个例子也需要序数。
  • 如果没有序数,它只会在您指定文件中的 all 列时起作用。第一个例子是试图描述这种情况:)。如果您跳过一列或多列,则必须为所有列提供序号。
【解决方案2】:

您还可以使用子查询/派生表覆盖名称,例如

SELECT *
FROM (
    SELECT TOP 100 *
    FROM OPENROWSET (
        BULK 'some path',
        FORMAT = 'CSV',
        PARSER_VERSION ='2.0',
        FIRSTROW = 2
    ) AS [result]
) x ( col1, col2 ) 

这比我认为的 WITH 子句更紧凑,据我所知,您必须在其中指定所有列、所有数据类型和所有序数。不幸的是,它不允许您将列列表放在 [result] 别名之后。

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 2012-03-25
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2020-10-21
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多