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?
Le problème de la conversion d'une source non-unicode en une table SQL Server unicode peut être résolu en:
À 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.
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.
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.
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
C'est une solution qui utilise le IDE pour corriger:
Data Conversion
à votre flux de données, comme indiqué ci-dessous; Data Conversion
et configurez-le comme indiqué: 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:Et c'est tout .. Enregistrez et exécutez ..
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.
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.
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 !
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.
Je ne suis pas sûr que cela pose toujours un problème, mais j'ai trouvé cette solution simple:
J'espère que c'était clair et facile à suivre
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.
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
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