J'essaie de valider certains en-têtes de colonnes avant l'importation d'un ensemble de données mensuel. J'ai configuré une Exécuter une tâche SQL qui est censée récupérer les en-têtes de colonnes de la table du mois précédent et les stocker dans Header_Row sous forme de chaîne unique avec les noms de champs séparés par des virgules. La requête s'exécute très bien dans SQL Server, mais lorsqu'elle s'exécute dans SSIS, elle génère l'erreur suivante:

"The type of the value (Empty) being assigned to variable 'User:Header_Row' differs from the current variable type (String)."

1) Cela signifie-t-il que je ne reçois rien de ma requête?

2) Y a-t-il une autre méthode que je devrais utiliser dans SSIS pour obtenir les résultats de la requête que je recherche?

3) Y a-t-il un problème avec moi en utilisant la référence de variable dans ma requête comme une partie d'une chaîne? Je pense que la réponse est oui, mais je voudrais confirmer, car ma variable était toujours vide après avoir changé cela.

Requête d'origine:

SELECT DISTINCT
    STUFF((
            SELECT
                ',' + COLUMN_NAME
            FROM
                db_Analytics.INFORMATION_SCHEMA.COLUMNS aa
            WHERE
                TABLE_NAME = 'dt_table_?'
            ORDER BY
                aa.ORDINAL_POSITION
          FOR
            XML PATH('')
          ), 1, 1, '') AS Fields
FROM
    db_Analytics.INFORMATION_SCHEMA.COLUMNS a;

EDIT: Après avoir changé la variable pour couvrir le nom complet de la table, j'ai une nouvelle erreur disant "Le type de valeur (__ComObject) ne peut être converti qu'en variables de type Object."

Requête finale:

SELECT DISTINCT
    CAST(STUFF((
            SELECT
                ',' + COLUMN_NAME
            FROM
                db_Analytics.INFORMATION_SCHEMA.COLUMNS aa
            WHERE
                TABLE_NAME = ?
            ORDER BY
                aa.ORDINAL_POSITION
          FOR
            XML PATH('')
          ), 1, 1, '') As varchar(8000)) AS Fields
FROM
    db_Analytics.INFORMATION_SCHEMA.COLUMNS a;
0
grichmer 20 avril 2017 à 21:12

3 réponses

Meilleure réponse

Il y a deux problèmes avec la requête ci-dessus:

1) La requête de la tâche n'a pas été correctement paramétrée. J'ai corrigé cela en mettant le nom complet de la table du mois précédent dans la variable.

2) La longueur par défaut du résultat était MAX, ce qui posait un problème lorsque SSIS tentait de le mettre dans ma variable, Header_Row . J'ai résolu ce problème en convertissant le résultat de la requête en varchar (8000).

Merci à tous pour l'aide.

0
grichmer 20 avril 2017 à 20:58

Vous essayez de paramétrer votre requête. Un paramétrage des requêtes correct est utile pour éviter les attaques par injection SQL, etc.

Votre requête recherche un TABLE_NAME qui est littéralement "dt_table_?" Ce n'est probablement pas ce que vous voulez.

Par paresse, je le réécrirais simplement

DECLARE @tname sysname = 'dt_table_' + ?;
SELECT DISTINCT
    STUFF((
            SELECT
                ',' + COLUMN_NAME
            FROM
                db_Analytics.INFORMATION_SCHEMA.COLUMNS aa
            WHERE
                TABLE_NAME = @tname
            ORDER BY
                aa.ORDINAL_POSITION
          FOR
            XML PATH('')
          ), 1, 1, '') AS Fields
FROM
    db_Analytics.INFORMATION_SCHEMA.COLUMNS a;

Si cela ne fonctionne pas, vous devrez peut-être utiliser une expression pour créer la requête.

2
billinkc 20 avril 2017 à 18:36

Je suis vraiment sûr que c'est votre problème:

TABLE_NAME = 'dt_table_?'

Je suppose que c'est une tentative de paramétrer la requête, mais le fait d'avoir le point d'interrogation à l'intérieur du guillemet simple fera prendre le point d'interrogation à la lettre.

Essayez comme ceci à la place:

TABLE_NAME = ?

Et lorsque vous remplissez la variable que vous utilisez comme valeur de paramètre, incluez la partie «dt_table_» dans la valeur de la variable.

ÉDITER:

Toujours dans votre affectation ResultSet, essayez de changer "Champs" en "0" dans la colonne Nom du résultat.

2
Tab Alleman 20 avril 2017 à 19:10