web-dev-qa-db-fra.com

Msg 8152, les données de chaîne ou binaires seraient tronquées

J'ai ce tableau:

CREATE TABLE Vendors

(
    VendorID            NUMERIC(10)     NOT NULL,
    VendorName          CHAR(50)        NOT NULL,
    VendorAddress       VARCHAR(30)     NULL,
    VendorCityName      VARCHAR(20)     NOT NULL,
    VendorStateName     CHAR(2)         NOT NULL,
    VendorZip           VARCHAR(10)     NULL,
    VendorContactName   CHAR(50)        NOT NULL,
    VendorContactPhone  VARCHAR(12)     NOT NULL,
    VendorContactEmail  VARCHAR(20)     NOT NULL,
    VendorSpecialty     CHAR(20)        NOT NULL

    CONSTRAINT VendorsPK        PRIMARY KEY (VendorID)      
);

Et cet insert:

INSERT INTO Vendors(VendorID, VendorName, VendorAddress, 
  VendorCityName, VendorStateName, VendorZip, VendorContactName, 
  VendorContactPhone, VendorContactEmail, VendorSpecialty)
VALUES(151330, 'Hyperion', '77 West 66th Street', 'New York', 
  'NY', 10023, 'John Hinks', '212-337-6564', 
  '[email protected]', 'Popular fiction')

Pourquoi cette instruction génère-t-elle l'erreur 8152?

14
Stephen Fians

VendorContactEmail ne fait que 20 octets. Votre adresse e-mail sur la première ligne ([email protected]) Est plus longue que cela - 24 octets. Et de nombreuses adresses e-mail seront plus longues. Qui a décidé de n'autoriser que 20 caractères dans la colonne de l'adresse e-mail? Selon la norme, cela devrait être VARCHAR(320) - 64 caractères pour <localpart> + 1 pour @ + 255 pour <domain>.

Quant au message d'erreur lui-même, trouver le coupable est plus facile aujourd'hui qu'il ne l'était à l'époque.

30
Aaron Bertrand

Force l'opération qui se traduit par une troncature à exécuter de toute façon

SET ANSI_WARNINGS  OFF;
-- Your operation TSQL here.
SET ANSI_WARNINGS ON;

(source)

8
Jon