Chaîne SQL Server ou des données binaires seront tronqués
Je suis impliqué dans un projet de migration de données. Je reçois le message d'erreur suivant lorsque j'essaie d'insérer les données d'une table dans une autre table (SQL Server 2005):
Msg 8152, Niveau 16, État, 13, Ligne 1
String ou des données binaires d'être tronquée.
La source de données des colonnes correspond au type de données et sont à l'intérieur de la longueur des définitions de la destination des colonnes de la table donc je suis à une perte quant à ce qui pourrait être la cause de cette erreur.
- Auriez-vous l'esprit de poster du code, et des informations sur chaque table?
- Les tableaux sont tous les deux assez grand donc je vais poster uniquement la partie de la table definintions qui sont impliqués et le code est acceptable?
- Les définitions de table et le code serait génial.
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin d'afficher les définitions de table pour les tables source et de destination pour nous de figure où la question est mais la ligne de fond est que l'un de vos colonnes de la table source est plus grand que votre destination colonnes. Il se pourrait que vous ayez à changer des formats dans une manière que vous n'étiez pas au courant de. Le modèle de base de données vous vous déplacez de est important de le comprendre ainsi.
La question est assez simple: un ou plusieurs colonnes dans la requête source de données contient des données qui dépasse la durée de sa colonne de destination. Une solution simple serait de prendre votre requête source et exécuter
Max(Len( source col ))
sur chaque colonne. I. e.,Puis comparer ces longueurs pour le type de données longueur de votre table de destination. Au moins un, est supérieure à sa destination, la longueur de la colonne.
Si vous êtes absolument certain que cela ne devrait pas être le cas et ne se soucient pas si il n'est pas le cas, puis une autre solution est de force à la fonte de la requête source colonnes à destination de longueur (ce qui tronque les données qui est trop long):
Comme d'autres l'ont déjà dit, l'une de vos colonnes de types de données dans la table source est plus grande que votre colonnes de destination.
Une solution simple est tout simplement de désactiver l'avertissement et de permettre la troncature à prendre place. Donc, si vous recevez cette erreur, mais vous êtes sûr qu'il est acceptable pour les données de votre ancienne base de données/tableau tronqué (coupé à la taille), vous pouvez simplement faire ce qui suit;
Comme ci-dessus, n'oubliez pas de mettre des avertissements à nouveau par la suite. J'espère que cette aide.
Une autre raison pour cela est si vous avez une valeur par défaut à l'installation d'une colonne qui dépasse la longueur de la colonne. Il semble quelqu'un de graisse doigts d'une colonne qui avait une longueur de 5, mais la valeur par défaut de dépassement de la durée de 5. Ce qui m'a poussé les noix que j'essayais de comprendre pourquoi il n'était pas en train de travailler sur n'importe quel insert, même si tout ce que je a été l'insertion était une colonne unique avec un nombre entier de 1. Car la valeur par défaut sur le schéma de la table avait que la violation de valeur par défaut, il a sali tout cela - qui, j'imagine, nous amène à la leçon d'éviter d'avoir des tables avec la valeur par défaut dans le schéma. 🙂
Pour les autres, aussi vérifier votre procédure stockée. Dans mon cas, dans ma procédure stockée
CustomSearch
j'ai accidentellement déclaré ne pas assez de longueur pour ma colonne, donc quand je suis entré dans un big data, j'ai reçu cette erreur, même si j'ai une grande longueur sur ma base de données. J'ai juste modifié la longueur de ma colonne dans ma recherche personnalisée que l'erreur disparaisse. C'est juste pour le rappel. Merci.Cela peut être difficile d'erreur. Voici quelques notes prises à partir https://connect.microsoft.com/SQLServer/feedback/details/339410/ recherchez AmirCharania commentaire.
J'ai ajusté la réponse donnée par AmirCharania pour les données sélectionnées dans une table réelle, au lieu d'un temp un. D'abord, sélectionnez votre source de données dans une table d'élaboration puis exécutez la commande suivante:
Oui,je suis aussi face à ce genre de problème.
Ici, j'ai des REMARQUES de la modification déposée longueur de 500 à 1000
SQL Server 2019 permettra enfin de retour, plus de message d'erreur significatif.
Pour activer le nouveau comportement, vous devez utiliser
DBCC TRACEON(460)
. Nouveau texte d'erreur desys.messages
:String ou des données Binaires d'être tronquée: remplacement de l'infâme erreur 8152
SQL Server 2017 CU12 prend également en charge cette fonctionnalité.
Amélioration: l'Option de remplacement de "Chaîne de caractères ou des données binaires seront tronquées" message avec des informations étendues dans SQL Server 2017
db<>le violon de démonstration
J'ai construit une procédure stockée qui analyse une source de la table ou de la requête avec plusieurs caractères par colonne parmi lesquels la longueur minimale (min_len) et de longueur maximale (max_len).
- Je stocker cette procédure dans la base de données de sorte que je peux l'utiliser dans toutes les bases de données comme suit:
Et la sortie est:
column description constraint_type fk_table fk_column pos default null data_type length precision radix is_unique min_len max_len nulls blanks numerics distincts distinct_values remarks
id_individual NULL PRIMARY KEY NULL NULL 1 NULL NO int NULL 10 10 1 1 2 0 0 70 70 Many (70) unique,all numeric,
id_brand NULL NULL NULL NULL 2 NULL NO int NULL 10 10 0 1 1 0 0 70 2 2,3 same length,all numeric,
guid NULL NULL NULL NULL 3 (newid()) NO uniqueidentifier NULL NULL NULL 1 36 36 0 0 0 70 Many (70) unique,same length,
customer_id NULL NULL NULL NULL 4 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
email NULL NULL NULL NULL 5 NULL YES varchar 100 NULL NULL 0 4 36 0 0 0 31 Many (31)
mobile NULL NULL NULL NULL 6 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
initials NULL NULL NULL NULL 7 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
title_short NULL NULL NULL NULL 8 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
title_long NULL NULL NULL NULL 9 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
firstname NULL NULL NULL NULL 10 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
lastname NULL NULL NULL NULL 11 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
address NULL NULL NULL NULL 12 NULL YES varchar 100 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
pc NULL NULL NULL NULL 13 NULL YES varchar 10 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
kixcode NULL NULL NULL NULL 14 NULL YES varchar 20 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
date_created NULL NULL NULL NULL 15 (getdate()) NO datetime NULL NULL NULL 1 19 19 0 0 0 70 Many (70) unique,same length,
created_by NULL NULL NULL NULL 16 (user_name()) NO varchar 50 NULL NULL 0 13 13 0 0 0 1 loyalz-public same length,
id_location_created NULL FOREIGN KEY location id_location 17 NULL YES int NULL 10 10 0 1 1 0 0 70 2 1,2 same length,all numeric,
id_individual_type NULL FOREIGN KEY individual_type id_individual_type 18 NULL YES int NULL 10 10 0 NULL NULL 70 0 0 0 NULL all null,empty,
optin NULL NULL NULL NULL 19 NULL YES int NULL 10 10 0 1 1 39 0 31 2 0,1 same length,
sp_
préfixe pour les procédures stockées. Microsoft a réservés préfixe pour son propre usage (voir Désignation des Procédures Stockées), et de vous faire courir le risque d'un conflit de nom dans le futur. C'est aussi mauvais pour votre procédure stockée performance. Il est préférable de tout simplement évitersp_
et d'utiliser quelque chose comme un préfixe ou pas de préfixe à tous!Je vais ajouter une autre cause possible de cette erreur simplement parce que personne n'a mentionné, et il pourrait aider certaines personne future (depuis l'OP a trouvé sa réponse). Si la table que vous insérez dans a des déclencheurs, il pourrait être l'élément déclencheur est la génération de l'erreur. J'ai vu cela se produire lorsque des champs de la table définitions ont été modifiées, mais la vérification des tables n'étaient pas.
Yep - "une pinte dans une demi-pinte pot ne sera pas aller". Je n'ai pas eu beaucoup de chance (pour quelque raison que ce soit) avec les différents SPs que les gens ont suggéré, MAIS aussi longtemps que les deux tables sont dans la même DB (ou vous pouvez les obtenir dans la même DB), vous pouvez utiliser INFORMATION_SCHEMA.Les COLONNES de localiser l'errant champ(s), ainsi:
Cela vous permettra de défilement vers le haut et vers le bas, en comparant les longueurs de champ, comme vous allez. Le commentaire sections vous permettent de voir (une fois retirée, évidemment) si il y a des différences de type de données, ou plus précisément pour montrer à ceux qui diffèrent par la longueur de champ - parce que je suis trop paresseux pour faire défiler - juste être conscient que la chose entière est fondée sur la source de la colonne des noms correspondant à ceux de la cible.
cela peut aussi arriver quand vous n'avez pas les autorisations adéquates
J'ai été en utilisant la chaîne vide "sur la création de la table et ensuite recevoir le message d'erreur" Msg 8152, Chaîne de caractères ou des données binaires seront tronquées " sur mise à jour ultérieure. Ce qui se passait en raison de la valeur de mise à jour contenant 6 caractères et être plus grande que la définition de la colonne prévue. J'ai utilisé un "ESPACE" pour contourner cela, uniquement parce que je savais que j'allais être mise à jour en vrac suite à la première création de données, c'est à dire la colonne n'allait pas rester vide longtemps.
SI GROSSE mise en garde ICI: Ce n'est pas particulièrement lisse solution, mais elle est utile dans le cas où vous êtes à rassembler un ensemble de données, par exemple sur des demandes de renseignements où vous créez un tableau pour l'exploration de données, l'application de certaines traitement en vrac/interprétation et de stocker les résultats avant et après pour comparaison ultérieure/mines. C'est un phénomène fréquent dans ma ligne de travail.
Vous pouvez remplir à l'aide de l'ESPACE de mots clés à savoir
Les mises à jour ultérieures de "column_name" de 10 caractères ou moins (à remplacer le cas échéant) seront alors autorisés sans causer de tronquer erreur. Encore une fois, je tiens seulement à l'utiliser dans des scénarios similaire à celle décrite dans ma mise en garde.
J'ai eu un problème similaire. J'ai été la copie de données d'une table à l'identique d'un tableau en tout sauf le nom.
Finalement, j'ai viré la table source dans une table temporaire à l'aide d'une instruction SELECT INTO.
J'ai comparé le schéma de la table source à la température de la table. J'ai trouvé l'une des colonnes était un
varchar(4000)
lorsque je m'attendais à unvarchar(250)
.Mise à JOUR:
Varchar(4000), ce problème peut être expliqué ici dans le cas où vous êtes intéressé:
Pour Nvarchar(Max), je suis en obtenant seulement 4000 caractères en TSQL?
Espère que cette aide.
Cette erreur est renvoyée lorsque la colonne d'une table permet de contrainte [ pour la plupart de la longueur ]. . E. g. si le schéma de base de données pour la colonne macolonne est de type CHAR(2), puis lors de votre appel à partir de votre application pour insérer la valeur, vous devez passer une Chaîne de caractères de longueur deux.
L'erreur de coeur, dit-il; chaîne de caractères de longueur et trois ci-dessus est incompatible pour s'adapter à la limitation de la longueur spécifiée par le schéma de base de données. C'est pourquoi SQL Server avertit et jette la perte de données/erreur de Troncation.
Ici est légèrement différente de réponse. Vos noms de colonne & longueurs peuvent correspondre, mais peut-être que vous spécifiez les colonnes dans le mauvais ordre dans votre instruction SELECT. Dire tableX et tableY avoir des colonnes avec le même nom, mais dans un ordre différent
S'il vous plaît essayer le code suivant:
J'ai écrit un utile store procédure pour identifier et résoudre le problème du texte de troncature (Chaîne de caractères ou des données binaires seront tronquées) lorsque l'instruction INSERT SELECT est utilisé. Il compare les champs de type CHAR, VARCHAR, NCHAR ET NVARCHAR seulement et renvoie une évaluation champ par champ, dans le cas d'être la cause possible de l'erreur.
CODE DE LA FONCTION:
Pour l'instant uniquement en charge les types de données CHAR, VARCHAR, NCHAR et NVARCHAR. Vous pouvez trouver la dernière versión de ce code dans le lien suivant ci-dessous et nous aider les uns les autres afin de l'améliorer. GetFieldStringTruncate.sql
https://gist.github.com/jotapardo/210e85338f87507742701aa9d41cc51d