Microsoft SQL插入表列的子集失败

时间:2015-06-23 03:01:24

标签: sql-server sql-server-2008

任何人都可以帮我找到此表中数据被截断的列或列吗?

我正在尝试执行下面的SQL插入,但它失败并出现错误:

  

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

我理解的意思是一个值太大而不能被表中的列包含,但我的insert语句中指定的所有值似乎都是其列的可接受大小。

使用Microsoft SQL Server 2008我的查询是:

INSERT INTO cms_incident_report(cid, userid, rhid, catid)   
VALUES('2', '436', '68402', '4')` 

我已经跟踪了这个问题并且我没有在我的查询中包含其余列,表cms_incident_report有54列,其中一列是自动递增的主键,其余的都有'允许空值'启用。如果我运行一个在该表的所有字段中插入值的查询,它就可以工作,如果我忽略了一列就会产生这个错误。

我成功地在其他表上使用相同的查询,而不需要编写所有列名,只需要插入我要插入的列,其余的默认为NULL。它对我来说没有多大意义,我无法弄清楚这个错误背后的真正原因。

修改

cid, userid, rhid, catid的类型为int, varchar(200), int, int

全表架构:

CREATE TABLE [dbo].[cms_incident_report]
(
    [incident_id] [int] IDENTITY(1,1) NOT NULL,
    [cid] [int] NULL,
    [userid] [varchar](200) NULL,
    [rhid] [int] NULL,
    [catid] [int] NULL,
    [col1] [varchar](40) NULL,
    [col2] [varchar](40) NULL,
    [col3] [varchar](40) NULL,
    [col4] [varchar](max) NULL,
    [col5] [date] NULL,
    [col6] [varchar](200) NULL,
    [col7] [tinyint] NULL,
    [col8] [tinyint] NULL,
    [col9] [varchar](max) NULL,
    [col10] [varchar](max) NULL,
    [col11] [varchar](200) NULL,
    [col12] [date] NULL,
    [col13] [varchar](200) NULL,
    [col14] [varchar](max) NULL,
    [col15] [date] NULL,
    [col16] [varchar](10) NULL,
    [col17] [varchar](max) NULL,
    [col18] [varchar](max) NULL,
    [col19] [int] NULL,
    [col20] [varchar](max) NULL,
    [col21] [int] NULL,
    [col22] [date] NULL,
    [col23] [varchar](10) NULL,
    [col24] [varchar](max) NULL,
    [col25] [int] NULL,
    [col26] [varchar](max) NULL,
    [col27] [int] NULL,
    [col28] [date] NULL,
    [col29] [varchar](10) NULL,
    [col30] [varchar](max) NULL,
    [col31] [int] NULL,
    [col32] [varchar](max) NULL,
    [col34] [int] NULL,
    [col35] [date] NULL,
    [col36] [varchar](200) NULL,
    [col37] [varchar](max) NULL,
    [col38] [int] NULL,
    [col40] [varchar](max) NULL,
    [col41] [int] NULL,
    [col42] [date] NULL,
    [col43] [varchar](200) NULL,
    [col44] [varchar](max) NULL,
    [col45] [int] NULL,
    [col46] [varchar](max) NULL,
    [col47] [int] NULL,
    [col48] [date] NULL,
    [col49] [varchar](200) NULL,
    [status] [varchar](3) NULL,
PRIMARY KEY CLUSTERED 
(
    [incident_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[cms_incident_report] ADD  DEFAULT ('0') FOR [col13]
GO

ALTER TABLE [dbo].[cms_incident_report] ADD  DEFAULT ('0') FOR [col42]
GO

ALTER TABLE [dbo].[cms_incident_report] ADD  DEFAULT ('Open') FOR [status]
GO

2 个答案:

答案 0 :(得分:2)

如果您在重新编辑时提供的数据类型正确,则更改以下值的值:

VALUES('2','436','68402','4')

VALUES(2,'436',68402,4)

匹配定义的类型。这将处理截断的错误消息。

查找是否插入默认值的另一种方法是,尝试这一行,然后查看通过其他逻辑填充的列:

INSERT INTO cms_incident_report DEFAULT VALUES

检查所有非空列。

答案 1 :(得分:2)

检查会尝试为给定列插入的值太大的约束或触发器。当发生一段时间的模式更改,并且约束或触发器在整个过程中都没有通过影响审查的范围时,就会发生这种情况。

在这种情况下(varchar(3))列status有一个默认约束,试图将四个字符值'Open'放入三个字符列。