T-SQL'无法插入值NULL'错误与非NULL值

时间:2014-05-20 22:34:58

标签: tsql ssms-2012

我正在将Simple Membership数据库迁移到Identity 2.0。我将CreateDate datetime NULL列复制到CreateDate datetime NOT NULL列。我检查了数据源表中Membership.CreateDate列中的所有记录,以验证它们是否包含有效的DateTimes。返回此错误:

Cannot insert the value NULL into column 'CreateDate', table 'Settlement.dbo.AspNetUsers'; column does not allow nulls. INSERT fails.
The statement has been terminated.

我还尝试删除成员资格中的所有记录但只有一个(其CreateDate列包含2012-12-27 01:35:03.610)。我得到了同样的错误。

我在SSMS中运行脚本。

迁移脚本摘录:

CREATE TABLE [dbo].[AspNetUsers] (
    [Id] [nvarchar](60) NOT NULL,
    [UserName] [nvarchar](15) NOT NULL,
    [AcId]  INT          NOT NULL,
    [LocId] INT          NOT NULL,
    [CreateDate] [datetime]      NOT NULL,
    [Email] [nvarchar](60),
    [EmailConfirmed] [bit] Default ((0)) NOT NULL,
    [PasswordHash] [nvarchar] (100),
    [SecurityStamp] [nvarchar] (60),
    [PhoneNumber] [nvarchar] (15),
    [PhoneNumberConfirmed] [bit] Default ((0)) NOT NULL,
    [TwoFactorEnabled] [bit] Default ((0)) NOT NULL,
    [LockoutEndDateUtc] [datetime],
    [LockoutEnabled] [bit] Default ((0)) NOT NULL,
    [AccessFailedCount] [int] Default ((0)) NOT NULL,
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY ([Id])
);
GO

INSERT INTO AspNetUsers(Id, UserName, AcId, LocId, PasswordHash, SecurityStamp, CreateDate )
SELECT UserProfile.UserId, UserProfile.UserName, UserProfile.BaId, UserProfile.OfcId,
webpages_Membership.Password, webpages_Membership.PasswordSalt, webpages_Membership.CreateDate
FROM UserProfile
LEFT OUTER JOIN webpages_Membership ON UserProfile.UserId = webpages_Membership.UserId
GO

如果我将AspNetUsers CreateDate列更改为NULL,它会成功地将日期时间从表复制到表,因此我知道所有列名称和类型都是正确的。 (这样做之后我跑了 ALTER TABLE [dbo].[AspNetUsers] ALTER COLUMN [CreateDate] datetime NOT NULL 并得到了相同的错误)

这与数据库的Production副本一起发生。我有一个通过相同的EF代码第一个代码生成的数据库的开发副本,它成功地将数据复制到CreateDate NOT NULL字段。

我此时的智慧已经结束了。当源数据是有效日期时,为什么我会收到Cannot insert the value NULL into column错误?或者为什么它不将CreateDate列数据识别为有效日期时间?

1 个答案:

答案 0 :(得分:1)

UserProfile中有一些用户webpages_Membership中没有相应的用户,因此您尝试插入没有任何信息的用户。您必须使用INNER JOIN代替LEFT OUTER JOIN,或为没有相应信息的用户提供默认值。