Microsoft 建议在时间戳上使用 Rowversion,但我在 sql server 2008 R2 中找不到“rowversion”数据类型

joh*_* Gu 4 sql-server-2008 sql-server sql-server-2008-r2

微软在这里提到我们应该使用 rowversion 数据类型而不是 Timestamps。现在在我的 SQL Server 2008 R2 中,我想创建一个具有 Rowversion 数据类型的列。但是在我的 SQL Server 2008 R2 Management Studio 中,我找不到这样的数据类型:

在此处输入图片说明

此外,当我尝试使用此语句更改名为时间戳的现有列时,该列的类型为时间戳:

ALTER TABLE [SkillManagement].[dbo].[Customer]
ALTER COLUMN timestamp rowversion 
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Msg 4927, Level 16, State 1, Line 1
Cannot alter column 'timestamp' to be data type timestamp
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议吗?

编辑

在此处输入图片说明

Aar*_*and 22

rowversion只是 的别名timestamp。在封面下,它们是完全相同的东西。

如果您使用的是 GUI(2012 年之前),则必须使用timestamp. (外围提示:请停止使用 GUI。)

但它并不止于此。即使您使用 DDL 生成此表:

CREATE TABLE dbo.x(y ROWVERSION);
Run Code Online (Sandbox Code Playgroud)

元数据中的数据类型将是timestamp

SELECT t.name 
  FROM sys.types AS t
  INNER JOIN sys.columns AS c
    ON c.system_type_id = t.system_type_id
  INNER JOIN sys.tables AS st
    ON c.[object_id] = st.[object_id]
  INNER JOIN sys.schemas AS s
    ON st.[schema_id] = s.[schema_id]
  WHERE st.name = N'x'
    AND s.name = N'dbo'
    AND c.name = N'y';
Run Code Online (Sandbox Code Playgroud)

如果您为此表生成脚本,它还将包括timestamp

CREATE TABLE [dbo].[x](
    [y] [timestamp] NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

事实上:

SELECT * FROM sys.types WHERE name = N'rowversion';
Run Code Online (Sandbox Code Playgroud)

结果:

----
0 row(s) affected.
Run Code Online (Sandbox Code Playgroud)

因此,系统中甚至没有一个名为的类型rowversion- 任何包含它的 DDL 在 DDL 甚至在针对服务器执行之前都会被解析和转换。

自从 Microsoft 首次引入名称不佳的数据类型(这也恰好违反了 SQL 标准,该标准规定该timestamp数据类型应用于日期/时间数据)以来,Microsoft 一直对此存在矛盾。我在 2007 年要求适当弃用此功能。我的连接项目仍然有效 存档 - 随意投票,更重要的是,评论文档如何与产品的可能用途相矛盾。

其他人也写过这方面的文章