首页 > 解决方案 > 具有正确类型和长度的疯狂“字符串或二进制数据将被截断”错误

问题描述

我有一个具有以下表结构的表;

CREATE TABLE [dbo].[SALES](
    [COLUMN1] [numeric](18, 0) NOT NULL,
    [COLUMN2] [varchar](11) NOT NULL,
    [COLUMN3] [numeric](18, 0) NULL,
    [COLUMN4] [numeric](18, 0) NULL,
    [COLUMN5] [datetime] NULL,
    [COLUMN6] [datetime] NULL,
    [COLUMN7] [numeric](18, 0) NULL,
    [COLUMN8] [numeric](18, 0) NULL,
    [COLUMN9] [smallint] NULL,
    [COLUMN10] [smallint] NULL,
    [COLUMN11] [datetime] NULL,
    [COLUMN12] [varchar](30) NULL,
    [COLUMN13] [smallint] NULL,
    [COLUMN14] [varchar](20) NULL CONSTRAINT [DF__SALES_DATA__3F3D11FA]  DEFAULT (null),
    [COLUMN15] [smallint] NOT NULL CONSTRAINT [DF_SALES_anonymous]  DEFAULT ((0)),
    [COLUMN16] [numeric](18, 0) NULL,
    [COLUMN17] [varchar](11) NULL,
    [COLUMN18] [smallint] NULL,
    [COLUMN19] [varchar](100) NULL,
    [COLUMN20] [datetime] NULL,
CONSTRAINT [XPKSALES] PRIMARY KEY CLUSTERED 
(
[COLUMN1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

但是,当我将 11 个字符的值更新到 COLUMN17 中(请注意,列长度为 11)时,SQL Server 会引发以下错误。我正在使用 SQL Server 2014。

字符串或二进制数据将被截断。

但是,我创建了一个表,其中一列的长度为 11 个字符,插入的值包含 11 个字符。它被成功插入,然后更新相同的值。更新太成功了。

有人可以帮我确定问题吗?

更新

出于某种原因,解决它的唯一方法是铸造价值

UPDATE SALES SET Column17 = CAST( '89000107051' AS VARCHAR(11)) 

有人可以解释为什么需要对具有适当长度的普通 varchar 值执行此操作吗?

注意:触发器不是答案

标签: sql-server

解决方案


推荐阅读