可以将 SSIS 包配置为大写所有列吗?

Can a SSIS package be configured to upper-case all columns?

我在 SSIS 方面没有太多经验,但被告知我们的数据库 tables 将使用 SSIS 导出到另一个系统。他们希望所有列名都大写(呃,不要让我开始,但这就是他们想要的)。我想避免为每个 table 编写自定义 SQL 脚本 -- SSIS 包是否可以配置转换标志或在导出执行期间可以将所有列大写的语句?

SSIS 中的数据移动进程是一个数据流任务。您 select 源、任何内联转换和目标。

您可以使用派生列组件来编辑现有列,因此假设我们的缓冲区中有 NameFirstNameLast 列,我们将为每列创建一个表达式以添加新的列的版本到缓冲区 NameFirstUpper 或替换 NameFirst 列的现有值。无论哪种方式,表达式都变成

UPPER([NameFirst])

您将必须应用 UPPER function call to every column. Unless you're looking to add some Biml,这将需要大量点击。

您可以根据 table 使用自定义查询来节省一些工作。类似于以下查询的内容将构建您的 SELECT 语句并在 table 中的每列调用 UPPER 函数(方便 TSQL 和 SSIS 表达式使用相同的函数名称进行调用)。

SELECT
    'SELECT ' + D.ColumnSelect + ' FROM ' + QUOTENAME(D.SchemaName) + '.' + QUOTENAME(D.TableName) + ';'
FROM
(
    SELECT
        S.name AS SchemaName
    ,   T.name AS TableName
    ,   STUFF(
        (
            SELECT
                ',' + 'UPPER(' + QUOTENAME(C.name) + ') AS ' + QUOTENAME(C.name)
            FROM
                sys.columns AS C
            WHERE 
                C.object_id = T.object_id
            FOR XML PATH('')
        )
        ,1,1, '') AS ColumnSelect
    FROM
        sys.schemas AS S
        INNER JOIN sys.tables AS T
        ON T.schema_id = S.schema_id
)D;

运行 针对您的源数据库,您将根据 table 获得一个查询,它会盲目地针对每一列调用 UPPER。数据类型是 guid、数字还是日期都没有关系,UPPER 不关心。

是的,查询可以使用一些较新的功能进行字符串连接和聚合等,但这适用于 SQL Server 2005+ 而不仅仅是 2012/2017+

同样,如果您想使用一些 Biml,您可以自动化包设计,但即使是手动创建包也应该很糟糕,因为现在您有一个查询可以为您完成工作,并且您的包成为来源查询(而不是 table)并且您知道输出的数据已经是大写的。将其降落在您的目的地 table 并且您有一个非常重复 table 的过程。

编辑

我的误解是问题涵盖了列内容,但实际上列名应该大写。自定义查询的方法保持不变,只是技术实现会发生变化。我将列本身的 TSQL UPPER 调用移到了别名

列上
SELECT
    'SELECT ' + D.ColumnSelect + ' FROM ' + QUOTENAME(D.SchemaName) + '.' + QUOTENAME(D.TableName) + ';'
FROM
(
    SELECT
        S.name AS SchemaName
    ,   T.name AS TableName
    ,   STUFF(
        (
            SELECT
                ',' + '' + QUOTENAME(C.name) + ' AS ' + QUOTENAME(UPPER(C.name))
            FROM
                sys.columns AS C
            WHERE 
                C.object_id = T.object_id
            FOR XML PATH('')
        )
        ,1,1, '') AS ColumnSelect
    FROM
        sys.schemas AS S
        INNER JOIN sys.tables AS T
        ON T.schema_id = S.schema_id
)D
ORDER BY D.SchemaName, D.TableName