任何人都可以帮我找到此表中数据被截断的列或列吗?
我正在尝试执行下面的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
答案 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'
放入三个字符列。