Msg 8152,字符串或二进制数据将被截断

时间:2013-04-23 14:40:42

标签: sql-server error-handling

我有这张桌子:

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)      
);

这个插入:

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', 
  'jhinks@hyperionbooks.com', 'Popular fiction')

为什么此语句会产生8152错误?

3 个答案:

答案 0 :(得分:28)

VendorContactEmail只有20个字节。第一行(jhinks@hyperionbooks.com)上的电子邮件地址长于24字节。许多电子邮件地址会更长。谁决定只在电子邮件地址栏中允许20个字符?根据标准,这应该是VARCHAR(320) - 64个字符用于localpart + 1用于@ + 255用于域。

答案 1 :(得分:7)

强制操作导致截断操作无论如何

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

(source)

答案 2 :(得分:0)

您还可以通过使用以下表达式来最小化列值的长度:

LEFT(columnName, 250) + '...'  

我尝试过,并且有效。