2

Microsoft.SqlServer.Management.Smo.SqlDataType枚举具有类型的值,但timestamp没有rowversion。我正在寻找程序集的更新版本或支持它的替代枚举类型。

现有枚举的值为Timestamp,但根据rowversion文档timestamp“已弃用,将在未来版本中删除”。我更喜欢避免使用已弃用的东西:)

4

2 回答 2

5

快速回答:

不,您不需要使用其他类型。Microsoft.SqlServer.Management.Smo.SqlDataTypedatatype 是要使用的正确类型。尽管是旧式名称,Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp但 SMO 为 SQL Server 类型的列返回的值rowversion

不推荐使用的是在 SQL Sever DDL 语句中使用类型名称“timestamp”。如果您的代码正在生成包含类型名称的 DDL 语句timestamp并将它们发送到 SQL Server,则应更改代码以改为使用[rowversion][4]。但是,如果您只是使用 SMO 或任何使用该类型的Microsoft.SqlServer.Management.Smo.SqlDataType类型,则不会受到服务器端名称更改的影响。

长答案:

我将在这里合并一些引用以避免重新发明轮子。首先,来自http://www.mssqltips.com/tip.asp?tip=1501的一些历史:

此数据类型 [ROWVERSION] 在 SQL Server 2000 中引入,最终取代了时间戳数据类型。在 ANSI-SQL 定义中,时间戳被定义为日期和时间,而 Microsoft 将其实现为每次行更改时都会更改的二进制值。微软警告说,时间戳的使用最终将被更改为遵守 ANSI 标准,因此应避免将其用于并发管理。目前,timestamp 和 rowversion 都是类似的......

请注意,Oracle 和 Postgres 都以符合标准的方式使用 TIMESTAMP,因此微软放弃时间戳的非标准使用以避免使 Oracle 开发人员尝试在 SQL Server 上工作变得更加困难是一个明智之举。

无论如何,从timestampto的变化rowversion只是名义上的。它不会影响使用该类型的列的行为。根据 MSDN 文档rowversion

timestamp 是 rowversion 数据类型的同义词,受数据类型同义词的行为影响。在 DDL 语句中,尽可能使用 rowversion 而不是 timestamp。有关详细信息,请参阅数据类型同义词 (Transact-SQL)。

如果您深入研究Data Type Synonyms的文档:

对原始对象和任何派生对象执行的所有后续元数据函数都将报告基本数据类型,而不是同义词。此行为发生在元数据操作中,例如 sp_help 和其他系统存储过程、信息架构视图或报告表或结果集列的数据类型的各种数据访问 API 元数据操作。

换句话说,当 SMO 获得有关表的元数据时,它只知道 rowversion。这意味着具有 rowversion 类型列的表将作为Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp

SMO API 从未赶上 SQL Server 使用的新命名。但是因为类型的底层行为没有改变,只有名称,你的 SMO 客户端代码不需要改变。

如果您的代码正在显示 SQL Server 数据类型,您可以成为一个好公民并将该代码更改为显示“rowversion”而不是“timestamp”。但否则您的代码根本不需要更改。事实上,大多数 SMO 客户端(包括 Visual Studio 的表格设计工具!)甚至都懒得更改他们的 UI 以反映新的命名。因为这些 UI 连接到幕后的枚举,所以无论 SQL Server 在 DDL 中调用什么类型,SMO API 客户端都将继续工作。

SMO API 的未来版本可能还会向枚举(例如Microsoft.SqlServer.Management.Smo.SqlDataType.RowVersion)添加具有相同基础数值的同义值,但鉴于现有客户端没有被破坏,这对它们来说可能是低优先级。

于 2010-03-17T09:00:35.647 回答
1

我找不到任何表明SqlDataType.Timestamp已弃用的内容。您提供的链接表明“timestamp语法”rowversion在 T-SQL 中已弃用,您应该改用rowversion它,但由库维护人员确保在他们的产品中实现正确的语法。如果在未来的版本中实际上删除了时间戳语法,那么我确信该库将被更新,并且Timestamp枚举值仍将向后兼容使用它的代码。由于它们不提供RowVersion枚举值,我只会使用Timestamp.

于 2010-03-16T23:20:54.630 回答