SQL异常 - 列不允许空值。 INSERT失败。我的数据不为空虽然

问题描述:

当我插入的对象没有任何空值时,可能会导致此异常? 我已调试并查看对象,没有空值,但它仍然会引发异常。我能想到的唯一的事情就是列的定义以前读SQL异常 - 列不允许空值。 INSERT失败。我的数据不为空虽然

identity(1,1) not null 

和我改变它只是

not null 

什么想法?

我的表

CREATE TABLE [dbo].[Products] (
    [ProductId]  INT    NOT NULL, 
    [Enabled]   BIT    CONSTRAINT [DF_Stock_Enabled] DEFAULT ((1)) NOT NULL, 
    [Sort]    INT    NOT NULL, 
    [ProductPrice] DECIMAL (18, 2) NOT NULL, 
    CONSTRAINT [PK_Stock] PRIMARY KEY CLUSTERED ([ProductId] ASC), 
    CONSTRAINT [FK_Stock_Products] FOREIGN KEY ([ProductId]) REFERENCES [dbo].[Products]  ([ProductId]) 
); 
+0

表的模式是什么,正在执行的INSERT语句是什么?如果您将“身份”列更改为不再是“身份证”,您是否为该列提供了值? – David 2015-01-15 16:58:05

+0

使用分析器,查找失败的查询。或者在你的应用程序中打开SQL日志记录。 – Andrey 2015-01-15 16:58:12

+0

是的,我毫无疑问为列提供了一个值。我认为这个错误与表格最初是以标识(1,1)创建然后被删除的事实有关。 – user1977591 2015-01-15 17:04:17

是,身份意味着将产生在插入该列的递增值。删除这意味着对该表的任何插入现在都会失败,因为它不再自动生成该序列号。

+0

除非INSERT包含该列的值。我们无法知道,因为OP没有分享任何有关失败代码的实际信息。虽然我同意这可能是问题。 – David 2015-01-15 17:03:17

+0

只有当SET IDENTITY_INSERT [table_name] ON时。 这就是说,除非已经打开,否则他不可能已经插入列。如果它被设置为OFF,他的插入将失败。 – gmiley 2015-01-15 17:06:09

+0

如果该列不再是一个身份,那么插入一个值不应该是必需的。 (如果它是一个身份,并且提供了一个值而不打开它,那么错误会有所不同。)但是,如果列不是一个标识并且不允许为null,那么如果未提供任何值,则会发生观察到的错误*。 – David 2015-01-15 17:07:36

当您的身份(1,1)不为空时,这意味着您不必为该列提供值。 SQL Server为其自身增加值(如果在该表上关闭了IDENTITY_INSERT)。

当您将其更改为非空时,您必须为该列提供值。在SQL SERVER Profiler中检查生成的语句。