web-dev-qa-db-fra.com

Erreur de package d'importation - Impossible de convertir un type de données chaîne Unicode et non Unicode

J'ai créé un package DTSX sur mon ordinateur avec SQL Server 2008. Il importe les données d'un fichier CSV délimité par des points-virgules dans une table dans laquelle tous les types de champs sont NVARCHAR MAX.

Cela fonctionne sur mon ordinateur, mais il doit être exécuté sur le serveur client. Chaque fois qu'ils créent le même package avec le même fichier csv et la même table de destination, ils reçoivent l'erreur ci-dessus.

Nous avons procédé à la création pas à pas du package, et tout semble aller pour le mieux. Les mappages sont tous corrects, mais lorsqu'ils exécutent le package à la dernière étape, ils reçoivent cette erreur. Ils utilisent SQL Server 2005.

Quelqu'un peut-il conseiller par où commencer à chercher ce problème?

63
Mike Thomas

Le problème de la conversion d'une source non-unicode en une table SQL Server unicode peut être résolu en:

  • ajouter une étape de transformation de conversion de données à votre flux de données
  • ouvrez la conversion de données et sélectionnez Unicode pour chaque type de données qui s'applique
  • notez l'alias de sortie de chaque colonne applicable (ils sont nommés par défaut Copie de [nom de colonne d'origine])
  • maintenant, dans l'étape Destination, cliquez sur Mappings
  • modifier toutes vos correspondances d'entrée pour qu'elles proviennent des colonnes avec alias de l'étape précédente (cette étape est facilement négligée et vous laissera vous demander pourquoi vous obtenez toujours les mêmes erreurs)
106
vanlandingham

À un moment donné, vous essayez de convertir une colonne nvarchar en une colonne varchar (ou vice-versa).

De plus, pourquoi tout (supposément) est nvarchar(max)? C'est une odeur de code si j'en ai jamais vu. Savez-vous comment SQL Server stocke ces colonnes? Ils utilisent des pointeurs vers l'emplacement où la colonne est stockée à partir des lignes réelles, car ils ne rentrent pas dans les 8 000 pages.

13
Eric

Types de données de chaîne non-Unicode:
Utilisez STR pour les colonnes de fichier texte et VARCHAR for SQL Server. 

Types de données de chaîne Unicode:
Utilisez W_STR pour les colonnes de fichier texte et NVARCHAR for SQL Server.

Le problème est que vos types de données ne correspondent pas, il pourrait donc y avoir une perte de données lors de la conversion.

8
Even Mien

Deux solutions: 1- si le type de la colonne cible est [nvarchar], il convient de remplacer par [varchar]

2- Ajoutez un composant "Colonne dérivée" au package SSIS et ajoutez une nouvelle colonne avec l'expression suivante:
(DT_WSTR, «longueur») [NomColonne]

Longueur est la longueur de la colonne dans la table cible et ColumnName est le nom de la colonne dans la table cible. Enfin, dans la partie mapping, vous devez utiliser cette nouvelle colonne ajoutée à la place de la colonne d'origine.

8
Hassan

Je ne suis pas sûr que ce soit une bonne pratique avec SSIS, mais je trouve parfois que leurs outils sont un peu maladroits lorsque vous voulez faire ce type d’activité.

Au lieu d'utiliser leurs composants, vous pouvez convertir les données de votre requête

Au lieu de faire

SELECT myField = myNvarchar20Field
FROM myTable

Vous pourriez faire

SELECT myField = CONVERT(VARCHAR(20),myNvarchar20Field)
FROM myTable
7
Chris Rodriguez

C'est une solution qui utilise le IDE pour corriger: 

  1. Ajoutez un élément Data Conversion à votre flux de données, comme indiqué ci-dessous; 

 enter image description here

  1. Double-cliquez sur l'élément Data Conversion et configurez-le comme indiqué: 

 enter image description here

  1. Maintenant, double-cliquez sur l'élément DB Destination, cliquez sur Mapping et assurez-vous que votre colonne input est identique à celle qui provient de la copie de [nom de votre colonne], qui est en fait la sortie Data Conversion et NON la sortie DB Source soyez prudent ici). Voici une capture d'écran:

 enter image description here

Et c'est tout .. Enregistrez et exécutez .. 

4
t_plusplus

Mike, j'ai eu le même problème avec SSIS dans SQL Server 2005 ... Apparemment, l'objet DataFlowDestination tentera toujours de valider les données entrant, En Unicode. Accédez à cet objet, Éditeur avancé, volet Propriétés du composant, définissez la propriété "ValidateExternalMetaData" sur False. A présent, accédez au volet Propriétés d'entrée et de sortie, Entrée de destination, Colonnes externes - définissez le type de données et la longueur de chaque colonne de manière à ce qu'ils correspondent à la table de base de données à laquelle il est destiné. Maintenant, lorsque vous fermez cet éditeur, ces modifications de colonne seront enregistrées et ne seront plus validées, et cela fonctionnera.

4
Brinky

Suivez les étapes ci-dessous pour éviter (impossible de convertir entre les types de données de chaîne Unicode et non Unicode) cette erreur.

i) Ajoutez l'outil de transformation de conversion de données à votre flux de données.
ii) Pour ouvrir la conversion de flux de données et sélectionner le type de données [string DT_STR].
iii) Ensuite, allez dans le flux de destination, sélectionnez Mappage.
iv. remplacez votre nom i/p par une copie du nom. 

4
Lavanya

La tâche de conversion de données DTS prend du temps s’il ya plus de 50 colonnes! Trouvez un correctif pour cela au lien ci-dessous

http://rdc.codeplex.com/releases/view/48420

Cependant, cela ne semble pas fonctionner pour les versions supérieures à 2008. C'est pourquoi j'ai dû contourner le problème.

*Open the .DTSX file on Notepad++. Choose language as XML
*Goto the <DTS:FlatFileColumns> tag. Select all items within this tag
*Find the string **DTS:DataType="129"**  replace with **DTS:DataType="130"**
*Save the .DTSX file. 
*Open the project again on Visual Studio BIDS
*Double Click on the Source Task . You would get the message

the metadata of the following output columns does not match the metadata of the external columns with which the output columns are associated:
...
Do you want to replace the metadata of the output columns with the metadata of the external columns?

 *Now Click Yes. We are done !
1
mhn

Accédez au registre pour configurer le client et modifiez LANG . Pour Oracle, accédez à HLM\SOFTWARE\Oracle\KEY_ORACLIENT ... HOME\NLS_LANG et passez à la langue appropriée.

1
Ziv.Ti

Je ne suis pas sûr que cela pose toujours un problème, mais j'ai trouvé cette solution simple:

  1. Clic droit source Ole DB
  2. Sélectionnez 'Edit'
  3. Sélectionnez l'onglet Propriétés d'entrée et de sortie
  4. Sous "Entrées et sorties", développez "Sortie source Ole DB" et Colonnes externes et colonnes de sortie.
  5. Dans les colonnes de sortie, sélectionnez le champ incriminé, dans le panneau de droite, assurez-vous que la propriété de type de données correspond à celle du champ dans les propriétés des colonnes externes.

J'espère que c'était clair et facile à suivre

1
Vuzi

Résolu - à la demande initiale:

J'ai déjà vu ça auparavant. Meilleure façon de résoudre le problème (vous n'avez pas besoin de toutes ces étapes de conversion des données, car TOUTES les métadonnées sont disponibles à partir de la connexion source):

Supprimez les destinations OLE de la base de données et les destinations OLE de la base de données Assurez-vous que la validation différée est définie sur FALSE (vous pouvez la définir sur True ultérieurement) Recréez la source de la base de données OLE avec votre requête , etc . Dans l'éditeur avancé, vérifiez que tous les types de colonnes de données en sortie sont corrects Recréez votre destination de base de données OLE, mappez-la, créez une nouvelle table (ou remappez-la sur celle existante) et vous verrez s'afficher. SSIS a obtenu tous les types de données corrects (identiques à ceux de la source).

Tellement plus facile que les choses ci-dessus.

1
randymaglio

Parfois, nous obtenons cette erreur lorsque nous sélectionnons un caractère statique comme champ dans la requête/vue/procédure source et le type de données du champ de destination dans Unicode.

Voici le problème que j'ai rencontré:J'ai utilisé le script ci-dessous à la source

et a obtenu le message d'erreur Column "CATEGORY" cannot convert between Unicode and non-Unicode string data types. ci-dessous: message d'erreur

Résolution: J'ai essayé plusieurs options mais aucune n’a fonctionné pour moi. Ensuite, j'ai préfixé la valeur statique avec N pour créer en Unicode comme ci-dessous:

SELECT N'STUDENT DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM STUDENTS
UNION
SELECT N'FACULTY DETAIL' CATEGORY, NAME, DATEOFBIRTH FROM FACULTY
0
Sanjeev Bind

Si ce problème persiste, j’ai trouvé qu’il était lié à une différence entre les versions d’Oracle Client.

J'ai posté mon expérience complète et ma solution ici: https://stackoverflow.com/a/43806765/923177

0
dayneo