SSIS Unpivot 包括列名

SSIS Unpivot including column names

(在 SQL Server 2008 上出价)

我有一个平面文件(竖线分隔),我已成功将其解析为以下格式:

AccountID    FreeText1    FreeText2    FreeText3    FreeText4
1            Some text    More text    Other text   Different Text
2            Some text    More text    Other text   Different Text
3            Some text    More text    Other text   Different Text

我需要最终结果如下所示:

AccountID    Title      TheData
1            FreeText1  Some text
1            FreeText2  More text
1            FreeText3  Other text
1            FreeText4  Different Text
2            FreeText1  Some text
2            FreeText2  More text
2            Freetext3  Other text
2            FreeText4  Different Text
3            FreeText1  Some text
3            FreeText2  More text
3            FreeText3  Other text
3            FreeText4  Different Text

我对 SSIS 还是比较陌生,所以边学边学。我在 Unpivot 转换中发现的所有内容似乎都是我需要的,但我无法根据列的名称("FreeText1" 等)弄清楚如何将它转到 Unpivot,我也没有已经能够完全掌握如何设置 Unpivot 转换以接近所需的结果。

我还没有找到任何可以在派生列中使用的 SSIS 公式以编程方式获取列名,我想也许我可以在派生列中生成列名,然后合并将两者连接在一起...但这似乎不是一种非常有效的方法,而且我无论如何也无法让它发挥作用。我已经尝试将派生列设置为 return 硬代码中的列名(例如,使用 "FreeText1" 作为公式),但是我仍然不确定如何将其与 Unpivoted 结果结合起来。

如有任何意见,我们将不胜感激!

我发现对于某些人来说,UnPivot 学习起来比它的价值更令人困惑,所以我总是尽可能避免使用它。如果你想采取不同的方法,你可以这样做:

将数据加载到临时 table 并 运行 对其进行以下查询:

Select * From
    (
    Select AccountID, 'FreeText1' Title, FreeText1 TheData From TableA
    Union All
    Select AccountID, 'FreeText2' Title, FreeText2 TheData From TableA
    Union All
    Select AccountID, 'FreeText3' Title, FreeText3 TheData From TableA
    Union All
    Select AccountID, 'FreeText4' Title, FreeText4 TheData From TableA
    ) A
Order By AccountID, Title

您可以使用 UNPIVOT 转换,它应该类似于

或者您可以将数据加载到分段 table 并使用 TSQL UNPIVOT 函数:

SELECT  upvt.AccountID, upvt.Title, upvt.TheData
FROM    dbo.StagingTable AS t
UNPIVOT (Title FOR TheData IN (FreeText1, FreeText2, FreeText3, FreeText4)) AS upvt;

或者稍微长一点,但更灵活的是使用CROSS APPLY along with a table value constructor来逆透视数据。例如

SELECT  t.AccountID, upvt.Title, upvt.TheData
FROM    dbo.StagingTable AS t
        CROSS APPLY
        (VALUES
            ('FreeText1', FreeText1),
            ('FreeText2', FreeText2),
            ('FreeText3', FreeText3),
            ('FreeText4', FreeText4)
        ) AS upvt (Title, TheData);