【问题标题】:Use table of column metadata as column header and type使用列元数据表作为列标题和类型
【发布时间】:2022-01-08 00:04:27
【问题描述】:

表格


dbo.元数据:

Column Type
ID int
Name varchar(50)
Location varchar(50)

dbo.数据:

Col1 Col2 Col3
1 Awesomenauts Inc. Germany
2 DataMunchers France
3 WeBuyStuff France

想要的输出:

ID Name Location
1 Awesomenauts Inc. Germany
2 DataMunchers France
3 WeBuyStuff France

有没有什么简单的方法可以做到这一点? 也许使用动态 SQL?

哦,架构可能每天都在谨慎,每天都会将所有内容批量重新加载到 DWH 中。

【问题讨论】:

    标签: sql azure-sql-database


    【解决方案1】:

    您需要在元数据中定义某种顺序才能使其正常工作。对于我的脚本,我添加了 ColumnOrder 以供参考

    /*Setup Metadata table*/
    DROP TABLE IF EXISTS #Metadata
    CREATE TABLE #Metadata (
        ColumnOrder INT IDENTITY(1,1) PRIMARY KEY /*Need to have some sort of defined column order, I created one for illustration purposes*/
        ,[Column] SYSNAME
        ,[Type] VARCHAR(255)
    )
    /*Load data*/
    INSERT INTO #Metadata
    VALUES 
    ('ID','int')
    ,('Name','varchar(50)')
    ,('Location','varchar(50)')
    
    /*Create dynamic SQL*/
    DECLARE @DynamicSQL NVARCHAR(MAX);
    
    /*Create column list*/
    ;WITH cte_Column AS (
        SELECT ColumnOrder,
            [Column]
            ,[Type]
            ,DataColName = CONCAT('Col',Row_Number () OVER (ORDER BY A.ColumnOrder))
        FROM #Metadata AS A
    )
    
    SELECT @DynamicSQL 
        = STRING_AGG(
            Concat(QUOTENAME([Column])
                ,' = CAST ('
                ,DataColName
                ,' AS '
                ,A.[Type]
                ,')')
                ,CONCAT(CHAR(13),CHAR(10),',') /*Line break + comma separators*/
            )
            WITHIN GROUP (ORDER BY A.ColumnOrder) /*Ensures columns concatenated in order*/
    FROM cte_Column AS A
    
    Set @DynamicSQL = CONCAT('SELECT ',@DynamicSQL,CHAR(13),CHAR(10),' FROM dbo.Data')
    
    PRINT @DynamicSQL
    
    /*Uncomment to execute*/
    --EXEC (@DynamicSQL)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2016-05-16
      • 2017-10-11
      相关资源
      最近更新 更多