我有一个MS-SQL数据库,其中包含很多具有TIMESTAMP列的表。这些列中的大多数都不是可为空的,但是其中一些是不可为空的,因此我想将可为空的列更改为不可为空。
但是以下我用谷歌搜索的SQL语句应该将列从可为空更改为不可为空
IF EXISTS (SELECT o.name FROM sysobjects o WHERE o.xtype='U' AND o.name='TableName')
BEGIN
ALTER TABLE TableName ALTER COLUMN [Timestamp] TIMESTAMP NOT NULL
END
SQL Server告诉我,Timestamp列不能更改为timestamp数据类型(我不这样做)。
我的陈述是否有问题,或者一旦将TIMESTAMP列创建为可为空,就不能将其设置为不可为空? 有没有一种方法可以更改列的可空性而不提供其数据类型? 还是真的必须完全删除该列,然后重新创建?
我知道为列名提供与某些关键字相同的名称是不受欢迎的,但这就像它一样,我无法更改。
使用SQL-Server 2008 R2和更高版本。
答案 0 :(得分:2)
要回答您的问题(或我认为您的问题是什么),timestamp
是rowversion
的同义词。您不能将列更改为timestamp
/ rowversion
列。同样,声明为timestamp
/ rowversion
的列将永远不会具有NULL
值。 DB<>Fiddle引用文档(rowversion (Transact-SQL) - Remarks (snippet)):
每次修改或插入具有rowversion列的行时,都会在rowversion列中插入增量的数据库rowversion值。
如果您需要在创建表后添加rowversion
,那么它们都将被赋予rowversion
的值。 DB<>fiddle
同样值得注意的是,rowversion
已过时(引用以上文档):
不建议使用时间戳语法。此功能处于维护模式,并且可能在将来的Microsoft SQL Server版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
我怀疑您真正想得到的是经过date(time)
修改的列,这是完全不同的事情。 timestamp
尽管是名字,但与时间无关:
rowversion
数据类型只是一个递增数字,并不保留日期或时间。要记录日期或时间,请使用datetime2
数据类型。
因此,如文档所述,请使用datetime2
(或其他日期(时间)数据类型)。