2009-01-12 10 views
8

J'ai des données d'entrée contenant des champs "voyous" qui sont plus longs que le champ de base de données correspondant. Cela provoque mon script d'importation, qui utilise des instructions SQL INSERT pour tomber avec un avertissement:SQL INSERT, Forcer le champ Truncate

Msg 8152, Level 16, State 13, Line 2 
String or binary data would be truncated. 

Comment puis-je forcer troncature de ces champs et activer mon script pour terminer?

+0

Avez-vous essayé de convertir en un varchar d'une certaine longueur? Si elle est supérieure à la longueur spécifiée, elle couperait la fin. – TheTXI

Répondre

8

Lorsque vous faites insérer quelque chose le long des lignes de:

INSERT INTO Table1('Column1') VALUES(LEFT(RTRIM(InputField), MaxLength)) 

Vous ne stocker les caractères gauche N à la DB.

+0

Merci mec, c'est assez bon (même si cela implique de modifier toutes les déclarations d'importation pertinentes). – Ben

1

Je ne connais pas un moyen plus facile que de les traquer et en utilisant LEFT(). J'aimerais savoir s'il y en a, cependant.

De toute évidence, en utilisant les métadonnées telles que INFORMATION_SCHEMA.COLUMNS, vous pouvez le déterminer automatiquement et le scripter pour qu'il fasse LEFT() à la longueur appropriée.

6

Personnellement, je veux qu'ils échouent, puis regarder les données. Je ne crois pas que vous devriez jamais envisager la troncature automatisée des données. Vous pourriez avoir besoin de rendre votre définition de champ plus grande. Vous ne saurez pas à moins d'inspecter visuellement les lignes qui échoueraient.

Exemple: Nous stockons des titres de discours. Supposons que vous aviez deux titres:
Comment lire un livre:
Comment lire un livre dans la baignoire sans se mouiller

Maintenant, si votre champ avait 10 caractères à la fois obtiendrait tronquée à la même chose. De plus, ce qu'ils ont tronqué n'aurait même pas de sens. Les deux diraient "Comment Rea" Maintenant, vous n'avez pas de différence entre deux titres très différents et ce que vous avez n'est pas correct de toute façon. Ajuster le champ pour stocker une plus grande quantité de caractères est clairement la bonne chose à faire. Cet exemple est stupide, mais garbage in, garbage out. Si vous tronquez les noms de personnes ou d'autres données critiques, vous finirez par rencontrer des problèmes car vous disposez de données erronées. J'ai vu cela se produire avec nos titres de discours, avec last_names, avec des adresses, des numéros de téléphone et beaucoup d'autres données. Si vous devez tronquer les données, il est plus que probable que vous stockez des données inutiles pour cet enregistrement. Soit les données ont besoin d'un nettoyage correct (comme supprimer le() - d'un numéro de téléphone si vous êtes conçu seulement stocker les numéros) avant d'importer dans les données de production ou le champ doit être plus grand.

+1

+1, mais vous auriez pu dire aussi à la fin: "si vous en avez vraiment besoin, utilisez LEFT()" – jcollum

7

Utiliser les avertissements Ansi? http://msdn.microsoft.com/en-GB/library/ms190368(v=sql.110).aspx

DECLARE @TABLE TABLE 
(
    Data VARCHAR(3) 
) 

SET ANSI_WARNINGS OFF 

INSERT INTO @TABLE 
VALUES('Hello World') 

SELECT * FROM @TABLE 

SET ANSI_WARNINGS ON 

INSERT INTO @TABLE 
VALUES('Goodbye World') 

SELECT * FROM @TABLE 
+3

Dans certaines situations, ce type de solution 'band band' peut être utile. Marchez prudemment, cependant. –

Questions connexes