89 votes

Les données de type chaîne ou binaire seraient tronquées. La déclaration a été terminée

J'ai rencontré un problème avec le serveur SQL, voici la fonction que j'ai créée :

ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS @trackingItems1 TABLE (
   item       nvarchar  NULL,
   warehouse   nvarchar NULL,
   price int   NULL
) 
AS
BEGIN
   INSERT INTO @trackingItems1(item, warehouse, price)
   SELECT ta.item, ta.warehouse, ta.price 
   FROM   stock ta
   WHERE  ta.price >= @price; 

   RETURN;
END;

Lorsque j'écris une requête pour utiliser cette fonction comme la suivante, j'obtiens l'erreur suivante

Les données de type chaîne ou binaire seraient tronquées. La déclaration a été terminée

Comment puis-je résoudre ce problème ?

select * from testing1(2)

Voici la façon dont je crée la table

CREATE TABLE stock(item       nvarchar(50) NULL,
                   warehouse   nvarchar(50) NULL,
                   price int NULL);

72voto

gbn Points 197263

Lorsque vous définissez varchar etc sans longueur, la valeur par défaut est 1.

Lorsque n n'est pas spécifié dans une déclaration de définition de données ou de déclaration de variable, la longueur par défaut est 1. Lorsque n n'est pas spécifié avec la fonction CAST, la longueur par défaut est 30.

Donc, si vous attendez 400 octets dans le fichier @trackingItems1 colonne de stock utiliser nvarchar(400) .

Sinon, vous essayez de faire entrer >1 caractère dans le texte de l'article. nvarchar(1) = échec

En guise de commentaire, c'est mauvaise utilisation de la fonction de valeur de la table aussi parce qu'il s'agit d'une "déclaration multiple". On peut l'écrire comme ceci et cela fonctionnera mieux

ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS
AS
   SELECT ta.item, ta.warehouse, ta.price 
   FROM   stock ta
   WHERE  ta.price >= @price;

Bien sûr, vous pourriez simplement utiliser une instruction SELECT normale

43voto

OakNinja Points 915

La longueur maximale de la colonne cible est inférieure à la valeur que vous essayez d'insérer.

Cliquez avec le bouton droit de la souris sur la table dans le gestionnaire SQL et allez dans 'Design' pour visualiser la structure de votre table et les définitions des colonnes.

Edit :

Essayez de définir une longueur sur vos insertions nvarchar qui soit la même ou plus courte que celle définie dans votre table.

24voto

Nick Points 2689

Dans mon cas, j'ai eu cette erreur parce que ma table avait

varchar(50)

mais j'ai injecté une longue chaîne de 67 caractères, ce qui a entraîné cette erreur. En le changeant en

varchar(255)

a réglé le problème.

8voto

Deb Points 312

Spécifiez une taille pour le article y entrepôt comme dans la FONCTION [dbo].[testing1].

@trackingItems1 TABLE (
item       nvarchar(25)  NULL, -- 25 OR equal size of your item column
warehouse   nvarchar(25) NULL, -- same as above
price int   NULL

) 

Puisque dans MSSQL on dit seulement nvarchar est égal à nvarchar(1), d'où les valeurs de la colonne provenant du fichier stock le tableau est tronqué

5voto

Gabriele Franco Points 819

SQL Server 2016 SP2 CU6 et SQL Server 2017 CU12 ont introduit le drapeau de trace 460 afin de renvoyer les détails des avertissements de troncature. Vous pouvez l'activer au niveau de la requête ou au niveau du serveur.

Niveau de la requête

INSERT INTO dbo.TEST (ColumnTest)
VALUES (‘Test truncation warnings’)
OPTION (QUERYTRACEON 460);
GO

Niveau du serveur

DBCC TRACEON(460, -1);
GO

À partir de SQL Server 2019, vous pouvez l'activer au niveau de la base de données :

ALTER DATABASE SCOPED CONFIGURATION 
SET VERBOSE_TRUNCATION_WARNINGS = ON;

L'ancien message de sortie est :

Msg 8152, Level 16, State 30, Line 13
String or binary data would be truncated.
The statement has been terminated.

Le nouveau message de sortie est :

Msg 2628, Level 16, State 1, Line 30
String or binary data would be truncated in table 'DbTest.dbo.TEST', column 'ColumnTest'. Truncated value: ‘Test truncation warnings‘'.

Dans une future version de SQL Server 2019, le message 2628 remplacera le message 8152 par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X