当列具有默认约束时,SQL Server 2012获取列不能为空。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当列具有默认约束时,SQL Server 2012获取列不能为空。相关的知识,希望对你有一定的参考价值。

考虑以下架构......

create table dbo.dg_world_records(
                                     WorldRecordId    int          not null identity(1,1)
                                   , GameTypeId       int          not null
                                   ,  PlayerId        int          not null
                                   , NumberOfValues   int          not null
                                   , TotalTime        int          not null
                                   , DateOfRecord     datetime     not null
                                   , GameId           int          not null
                                   , UTCInserted      datetime     not null
                                   , UTCUpdated       datetime     not null
                                   , SrvName          varchar(30)  not null
                                 )


go
alter table dg_world_records add constraint dg_world_records_worldrecordid_pk primary key (worldrecordid)
go
alter table dg_world_records add constraint dg_world_records_utcinserted_df default getutcdate() for utcinserted
go
alter table dg_world_records add constraint dg_world_records_utcupdated_df default getutcdate() for utcupdated
go
alter table dg_world_records add constraint dg_world_records_srvname_df default @@servername for srvname
go

我正在定义非空列和最后三列(UTCInserted,UTCUpdated和SrvName)我正在创建默认约束。

我已经在我公司的开发服务器上做过很多次了,而且一切都运行良好。

但是,在我的本地SQL Server 2012实例上,以下insert语句引发错误。

insert into dbo.dg_world_records(gametypeid, playerid, numberofvalues, totaltime, dateofrecord, gameid)
values(11, 1, 365, 430000, getdate(), -1)

这是错误消息......

Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'SrvName', table 'dateguess.dbo.dg_world_records'; column does not allow nulls. INSERT fails.
The statement has been terminated.

我的猜测是SQL Server中有一个环境设置,允许您不为非空列指定默认约束的值。

谢谢,

答案

我想到了。

问题是以下声明......

@@servername

此语句返回null。

为了解决这个问题,我通过sp_addserver添加了本地服务器...

sp_addserver 'LT9LHJKV1SQLSERVERROCKS', local

然后我不得不重新启动SQL Server。

之后@@ servername返回一个值,我的insert语句有效。

以上是关于当列具有默认约束时,SQL Server 2012获取列不能为空。的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server-一次删除具有IF EXISTS的多列

SQL-SQL Server-添加具有默认值和检查约束的列

1 - SQL Server 2008 之 使用SQL语句创建具有约束条件的表

当列是NTEXT时,SQL Server:IN('asd')不工作

当列不共享任何参数(包括主键)时,如何在 MS SQL Server 中进行 FULL OUTER JOIN?

SQL Server(第一章) 创建表 删除表 创建主键约束唯一约束外键约束CHECK约束默认约束