Je n'ai pas beaucoup d'expérience avec SSIS, mais on m'a dit que nos tables de base de données seraient exportées vers un autre système utilisant SSIS. Ils aimeraient que tous les noms de colonnes soient en majuscules (pouah, ne me lancez pas, mais c'est ce qu'ils veulent). J'aimerais éviter d'écrire des scripts SQL personnalisés pour chaque table : les packages SSIS sont-ils configurables avec des indicateurs de transformation ou des instructions qui pourraient mettre en majuscule toutes les colonnes lors de l'exécution de l'exportation ?

1
mdelvecchio 19 oct. 2020 à 18:23

1 réponse

Meilleure réponse

Le processus de transfert de données dans SSIS est une tâche de flux de données. Vous sélectionnez une source, toutes les transformations en ligne et la destination.

Vous pouvez utiliser un composant de colonne dérivé pour modifier une colonne existante, donc en supposant que nous ayons des colonnes de NameFirst, NameLast dans notre tampon, nous créerions une expression par colonne pour ajouter une nouvelle version de la colonne à le tampon NameFirstUpper ou remplacer la valeur existante de la colonne NameFirst. Dans tous les cas, l'expression devient

UPPER([NameFirst])

Vous devrez appliquer le UPPER appel de fonction à chaque colonne. À moins que vous ne cherchiez à ajouter du Biml, cela demandera beaucoup de clics.

Vous pourriez vous épargner du travail en utilisant une requête personnalisée par table. Quelque chose comme la requête suivante construira vos instructions SELECT et appellera la fonction UPPER (pratique que les expressions TSQL et SSIS utilisent le même nom de fonction pour l'appel) par colonne dans une table.

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;

Exécutez cela sur votre base de données source et vous obtiendrez une requête par table et il appellera aveuglément UPPER sur chaque colonne. Peu importe que le type de données soit un guid, un nombre ou une date, UPPER s'en moque.

Oui, la requête peut utiliser certaines des fonctionnalités les plus récentes pour la concaténation et l'agrégation de chaînes, etc., mais cela fonctionne pour SQL Server 2005+ au lieu de seulement 2012/2017+

Encore une fois, vous pouvez automatiser la conception du package si vous souhaitez utiliser un peu de Biml, mais même une création de package manuelle devrait être mauvaise car vous avez maintenant une requête qui fait le travail pour vous et vos packages deviennent une source de requête (au lieu d'une table ) et vous savez que les données qui sortent sont déjà en majuscules. Atterrissez-le dans votre table de destination et vous obtenez un processus très reproductible.

Éditer

Mon malentendu était que la question couvrait le contenu de la colonne, mais à la place, les noms de colonne réels devraient être en majuscules. L'approche d'une requête personnalisée reste la même, seule la mise en œuvre technique changera. J'ai déplacé l'appel TSQL UPPER de la colonne elle-même pour être juste sur l'alias de la colonne

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
2
billinkc 19 oct. 2020 à 17:30