Conversion d'une chaîne non Unicode en chaîne Unicode SSIS

9

Je crée un package dans lequel j'exporterai les données d'une base de données dans un fichier Excel vide. Lorsque j'ai ajouté uniquement les composants source et de destination et que j'ai exécuté le package, j'ai eu une erreur de conversion indiquant que la colonne de sortie et la colonne «A» ne peuvent pas convertir entre les types de données de chaîne unicode et non unicode.

Pour résoudre ce problème, j'ai ajouté un composant de conversion de données et converti toutes les colonnes en

"Chaîne Unicode [DT_WSTR]"

et je n'ai plus reçu l'erreur. Le seul problème est que j'avais environ 50 colonnes où je devais aller 1 par 1 et sélectionner "Chaîne Unicode [DT_WSTR]" dans la liste déroulante. J'ai ensuite dû aller dans le composant de destination et mapper les colonnes nouvellement converties à mon fichier Excel.

Ma question est la suivante: si quelqu'un d'autre est tombé sur ce problème, existe-t-il un meilleur moyen plus efficace de contourner la nécessité de faire toutes les conversions manuelles de types de données? Devoir convertir et mapper toutes les colonnes une par une ne semble pas pratique, surtout si vous avez un grand nombre de lignes.

Je comprends que les fichiers Excel ne sont pas la meilleure solution pour importer et exporter des données, mais c'est ce qui est requis dans ce cas particulier.

Je pourrais chercher un moyen d'exporter simplement vers un fichier texte plat, puis d'essayer de convertir en Excel comme dernière étape du package. J'espère que cela ne déclenchera pas la même erreur de conversion unicode / nonunicode.

Juan Velez
la source
comment est votre syndrome du canal carpien après cela? :-)
Patrick Honorez
Assurez-vous que la table vers laquelle vous déplacez les données utilise des types de données Unicode (par exemple: nvarchar (50) au lieu de varchar (50))
MacGyver

Réponses:

15

Comme alternative à RDC, je sauterais simplement la conversion des types de données dans SSIS et les jetterais explicitement comme nvarchar dans ma requête source.

Usage

Dans votre requête source (et vous êtes utilisez une requête source et ne pas sélectionner simplement la table dans le bas de baisse), les choses explicitement jeté à une longueur char n approprié (var).

Au lieu de

SELECT
    E.BusinessEntityID
,   E.NationalIDNumber
,   E.LoginID
,   E.JobTitle
,   E.BirthDate
,   E.MaritalStatus
,   E.Gender
FROM
    HumanResources.Employee AS E

utiliser une requête telle que

SELECT
    CAST(E.BusinessEntityID AS nvarchar(10)) AS BusinessEntityID
,   CAST(E.NationalIDNumber AS nvarchar(15)) AS NationalIDNumber
,   CAST(E.LoginID AS nvarchar(256)) AS LoginID
,   CAST(E.JobTitle AS nvarchar(50)) AS JobTitle
,   CAST(E.BirthDate AS nvarchar(10)) AS BirthDate
,   CAST(E.MaritalStatus AS nchar(1)) AS MaritalStatus
,   CAST(E.Gender AS nchar(1)) AS Gender
FROM
    HumanResources.Employee AS E

Les étudiants astucieux d'AdventureWorks reconnaîtront que les données étaient déjà un n(var)chartype mais c'était simplement pour démontrer le concept.

Avantages

  • Moins de mémoire utilisée. Actuellement, vous allouez et stockez deux copies des "mêmes" données à l'aide Data Conversion Componentde SSIS
  • Pas de RSI . Pas besoin de cliquer N fois et de spécifier toutes ces informations dans le petit éditeur affreux qu'ils fournissent. J'utiliserais une requête contre le schéma dmv / information_schema pour automatiser davantage la génération d'exportations de table "Excel ready".
  • Aucune installation de composants personnalisés. J'ai travaillé dans des endroits où l'installation de l'open source était verboten. Il y a également un coût de maintenance différé à installer des applications tierces car maintenant "tout le monde" doit installer cette même application pour maintenir votre code et elle doit être installée sur les serveurs et infosec doit examiner les assemblys pour s'assurer qu'ils sont valides et nous avons besoin des signatures d'un bajillion de personnes qui vous dépassent ...
billinkc
la source
1
"Comme alternative au RDC" - Qu'est-ce que le RDC? Quand je lis la réponse suivante, je pense que vous pourriez vouloir dire Remplacer le composant de données, mais comme l'auteur de l'article d'origine n'a pas mentionné ce composant, il est peut-être trop tôt pour un acronyme. :-)
Thronk
parler de RSI, CONVERTdevrait être plus facile à coller 50 fois que CAST, puisque les arguments sont devant
Patrick Honorez
2

Si vous devez uniquement passer de "Chaîne Unicode (DT_WSTR)" à "Chaîne (DT_STR)" ou vice versa, vous pouvez le faire:

  1. Enregistrez une copie de votre fichier package.dtsx (dans le cas où vous devez récupérer)
  2. Ouvrez le package.dtsx dans un éditeur, ou dans MS Visual Studio, cliquez avec le bouton droit sur le package et choisissez "Afficher le code". Vous verrez un fichier XML.

Rechercher la chaîne DTS:DataType si elle est suivie de = "130", la colonne est alors définie comme DT_WSTR (unicode).

Si elle est suivie de = "129", alors la colonne est définie comme DT_STR (non-unicode), utilisez la recherche et remplacez avec soin (vous avez fait une copie avant, n'est-ce pas?)

Enregistrez le fichier et c'était peut-être tout.

cjonas
la source
1
Bienvenue sur le DBA SE! Conseil de pro: le site dispose de diverses fonctionnalités de formatage de texte pour rendre vos articles plus beaux. Utilisez les icônes en haut de la zone de texte de l'éditeur.
peterh