Non, il n'est enregistré nulle part. Allez voter et présentez votre analyse de rentabilisation; cela fait partie de la longue liste de choses qui devraient être corrigées dans SQL Server.
Cela a été demandé il y a des années sur Connect (probablement d'abord dans le délai SQL Server 2000 ou 2005), puis à nouveau sur le nouveau système de rétroaction:
Et maintenant, il a été livré dans SQL Server 2019 , SQL Server 2017 CU12 et apparaîtra dans une future SQL Server 2016 SP2 CU.
Dans le tout premier CTP public de SQL Server 2019, il n'apparaît que sous l'indicateur de trace 460. Cela semble un peu secret, mais il a été publié dans ce livre blanc de Microsoft . Ce sera le comportement par défaut (aucun indicateur de trace requis) à l'avenir, bien que vous puissiez le contrôler via une nouvelle configuration de portée de base de données VERBOSE_TRUNCATION_WARNINGS
.
Voici un exemple:
USE tempdb;
GO
CREATE TABLE dbo.x(a char(1));
INSERT dbo.x(a) VALUES('foo');
GO
Résultat dans toutes les versions prises en charge avant SQL Server 2019:
Msg 8152, niveau 16, état 30, ligne 5
Les données de chaîne ou binaires seraient tronquées.
La déclaration est terminée.
Maintenant, sur les serveurs CTP SQL Server 2019, avec l'indicateur de trace activé:
DBCC TRACEON(460);
GO
INSERT dbo.x(a) VALUES('foo');
GO
DROP TABLE dbo.x;
DBCC TRACEOFF(460);
Le résultat montre la table, la colonne et la valeur ( tronquée , pas pleine ):
Msg 2628, niveau 16, état 1, ligne 11
Les données de chaîne ou binaires seraient tronquées dans la table «tempdb.dbo.x», colonne «a». Valeur tronquée: 'f'.
La déclaration est terminée.
Jusqu'à ce que vous puissiez tout supprimer et mettre à niveau vers SQL Server 2019, ou passer à Azure SQL Database, vous pouvez modifier votre code "automagique" pour extraire réellement la longueur maximale sys.columns
, ainsi que le nom que vous devez y obtenir de toute façon, puis appliquer LEFT(column, max_length)
ou quel que soit l'équivalent de PG. Ou, puisque cela signifie simplement que vous perdrez silencieusement des données, essayez de déterminer quelles colonnes sont incompatibles et corrigez les colonnes de destination afin qu'elles tiennent toutes les données de la source. Étant donné l'accès aux métadonnées aux deux systèmes et le fait que vous écrivez déjà une requête qui doit automatiquement correspondre aux colonnes source -> destination (sinon cette erreur ne serait pas votre plus gros problème), vous ne devriez pas avoir à faire de force brute deviner du tout.
sys.columns
parce que je n'avais absolument aucune idée du code que vous utilisez actuellement pour générer "automatiquement" vos requêtes. Il n'y a vraiment pas beaucoup plus complexe que je pourrais deviner à incorporer dans votre codeSELECT name, object_id, max_length FROM sys.columns;
. Puisque vous avez déjà du code automagique qui doit faire cela - ou quelque chose de très similaire - je ne pensais pas qu'un exemple était nécessaire.sys.columns
fonctionne avec deux colonnes qui ont le mêmename
. De plus, j'ai fait fonctionner la chose en utilisant la bibliothèque plutôt quesys
, pourquoi devrais-je faire cela comme réponse choisie?Microsoft SQL doesn't have x, do y instead
est une contribution valable, mais si vousy
êtes inférieur au mieny
, je vais faire quelque chose de différent et le marquer comme choisi.Enfin, Microsoft a décidé de fournir des informations utiles pour
String or binary would be truncated
démarrer à partir de SQL Server 2016 SP2 CU, SQL Server 2017 CU12 et dans SQL Server 2019.Les informations incluent désormais à la fois la colonne du tableau incriminé (nom complet) et la valeur incriminée (tronquée à 120 caractères):
la source