2

Est-il possible d'avoir une colonne varchar comme clé primaire avec des valeurs comme 'a' et 'a', donne toujours cette erreur "Violation de la contrainte PRIMARY KEY" dans MS SQL Server 2008. Dans Oracle, ne donnez aucune erreur. BTW Je ne suis pas en train d'implémenter de cette façon que j'essaye seulement de faire migrer les données d'oracle vers sql server.Varchar avec des espaces de fin comme clé primaire dans SQL Server 2008

salutations

Répondre

1

Vous pouvez utiliser une colonne text ou ntext, qui dépend du type de données que vous importez et de sa longueur, ce qui permet de préserver les espaces. char remplira les espaces, donc peut ne pas convenir.

+1

text et ntext sont obsolètes, et char sera rempli avec des espaces si vous ne les fournissez pas. – RickNZ

+0

J'ai converti en char mais le serveur sql donne la même erreur. – cacaupt

+2

'text' et' ntext' peuvent être obsolètes, mais pour une importation ponctuelle dans une table temporaire, je ne vois aucun problème. – Oded

0

utiliser un type de données qui ne supprime pas les espaces de fin.

+0

Comme quoi? Et de tels types de données qui traitent le contenu comme une chaîne plutôt que comme une donnée binaire opaque? – binki

0

Vous pouvez essayer de stocker en tant que varbinary, puis de convertir en varchar lorsque vous sélectionnez.

0

Je pensais que cela pourrait avoir quelque chose à voir avec ANSI_PADDING: mais mes tests ici, indiquent que pour les PK (éventuellement UNIQUE INDEXES, pas essayé) cela n'aide malheureusement pas.

Alors:

SET ANSI_PADDING ON 

Works pour les champs non-PK - qui est, elle préserve l'espace de fuite sur l'insert, mais pour une raison pas ... PKs ​​

Voir:

http://support.microsoft.com/kb/154886/EN-US/

+0

merci je l'ai vu, ce que je ne sais pas, c'est s'il y a une forme d'option en changeant la façon (avec ou non) pad sql comparer des clés uniques ... – cacaupt

4

la norme SQL-92 dicte que, aux fins de comparaison de chaînes de caractères, les chaînes sont rembourrés être la même longueur avant la comparaison: ty picalement, le caractère pad est un espace.

Par conséquent 'a' et 'a' comparent EQUAL et ceci viole la contrainte PK. http://support.microsoft.com/kb/316626

Je n'ai rien trouvé pour indiquer que ce comportement a changé depuis lors.

Vous pouvez vous en tirer en utilisant varbinary au lieu de varchar mais cela peut ne pas faire ce que vous voulez non plus.

0

Vous pouvez ajouter une autre colonne à votre contrainte de clé primaire qui contient la longueur des données dans la colonne Oracle. Cela vous permettra d'importer les données et de reconstruire les données oracle quand vous en aurez besoin - avec une vue qui utilise la longueur des données oracle avec la longueur dans la table microsoft pour rajouter les espaces manquants pour les afficher dans les rapports etc.