web-dev-qa-db-fra.com

SQL Server Insert Into - Comment identifier la colonne à l'origine de l'erreur de troncature

J'ai une procédure stockée qui insère 650 champs dans une table. L'insertion échoue avec une erreur de troncature.

C'est simple

INSERT INTO
SELECT (a bunch of fields) 
FROM (a bunch of tables)

Voici le message d'erreur:

Msg 8152, niveau 16, état 14, procédure DSP_Procedure, ligne 1075 La chaîne ou les données binaires seraient tronquées.

Existe-t-il un moyen rapide d'identifier le champ à l'origine de l'erreur de troncature?

Le fait que l'instruction select à insérer dans la table comporte 650 champs rend difficile d'identifier exactement quel champ est à l'origine de l'erreur de troncature.

Je pense que je peux peut-être commenter des blocs de champs à la fois afin de n'avoir que le SP insérer 100 champs à la fois, puis exécuter le SP 6 ou 7 fois différentes jusqu'à ce que je puisse au moins réduire à un groupe de 100 champs qui contiendront le champ qui cause l'erreur de troncature.

Sinon, je pense que je peux peut-être simplement SELECT INTO une nouvelle table, puis comparez les longueurs de données de la table par rapport aux longueurs de données de la table cible dans laquelle j'essaye d'insérer dans mon SP pour voir quel champ contient un champ plus long que prévu) longueur...

J'utilise SQL Server 2014.

Des alternatives plus simples?

11
Juan Velez

Si vous utilisez SQL Server 2016 (SP2, CU6 ou plus récent), une option consiste à activer l'indicateur de trace 460, par exemple (QUERYTRACEON 460). La sortie indiquera la colonne et les données incriminées.

Consultez cet article pour plus de détails. https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/

Si vous ne vous souciez pas de la troncature, vous pouvez utiliser SET ANSI_WARNINGS OFFpour ignorer ce type de troncature.

3
user14472

Malheureusement, vous avez rencontré assez ancien une "fonctionnalité". Il y a eu un ticket Connect ouvert depuis 2008, et depuis près de dix ans, cela n'a pas été suffisamment important pour justifier une correction.

solution de contournement standard est, comme vous l'avez compris, un select into... suivi de la comparaison des métadonnées du tableau. Une autre possibilité est la recherche binaire dans la colonne incriminée, mais c'est aussi un travail manuel. Il existe des hacks pour la comparaison des métadonnées, mais il n'existe pas de solution simple et élégante. Peut-être que certains outils tiers seraient utiles, mais je n'en suis pas conscient.

9
vonPryz

L'utilisation de (QUERYTRACEON 460) n'a pas fonctionné pour moi lorsque je l'ai mis à la fin de ma requête.

Je l'ai allumé au niveau DB et cela a fonctionné:

DBCC TRACEON(460, -1);
GO

Mais, assurez-vous de le désactiver une fois que vous avez trouvé et résolu le problème, ne le laissez pas allumé!

DBCC TRACEOFF(460, -1);
GO
1
Taylor Brown