Microsoft.SqlServer.Management.Smo.SqlDataType
枚举的值为timestamp
,但不是rowversion
。我正在寻找程序集的更新版本或支持它的备用枚举类型。
现有枚举的值为Timestamp
,但根据rowversion
documentation,timestamp
已弃用,将在以后的版本中删除“。我宁愿避免使用弃用的东西:)
答案 0 :(得分:5)
快速回答:
不,您不需要使用其他类型。 Microsoft.SqlServer.Management.Smo.SqlDataType
数据类型是要使用的正确类型。尽管是旧式名称,但Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp
是SMO为类型为rowversion
的SQL Server列返回的值。
不推荐使用的是在SQL Sever DDL语句中使用类型名称“timestamp”。如果您的代码生成包含类型名称timestamp
的DDL语句并将其发送到SQL Server,则应将代码更改为使用[rowversion][4]
。但是,如果您只是使用SMO或使用Microsoft.SqlServer.Management.Smo.SqlDataType
类型的任何类型,则不会受到服务器端名称更改的影响。
长答案:
我将在这里结合一些引用,以避免重新发明轮子。首先,来自http://www.mssqltips.com/tip.asp?tip=1501的一些历史记录:
此数据类型[ROWVERSION]是 在SQL Server 2000中引入 最终替换时间戳数据 类型。在ANSI-SQL定义中, 时间戳被定义为日期和 微软实施它的时间 作为每个都改变的二进制值 时间一排变化。微软有 警告说使用时间戳会 最终被改为坚持了 ANSI标准所以它的用途 并发管理应该是 避免。目前,时间戳和 rowversion与每个都类似 其他...
请注意,Oracle和Postgres都以符合标准的方式使用TIMESTAMP,因此微软放弃非标准时间戳的使用是为了避免让Oracle开发人员更难以尝试使用SQL Server。 / p>
无论如何,从timestamp
到rowversion
的更改仅限于名称。它不会影响使用该类型的列的行为。根据{{3}}的MSDN文档:
时间戳是该词的同义词 rowversion数据类型并受制于 数据类型同义词的行为。在 DDL语句,改为使用rowversion 时间戳尽可能。对于 更多信息,请参阅
rowversion
如果你深入研究Data Type Synonyms (Transact-SQL).的文档:
所有后续元数据功能 在原始对象上执行 任何派生对象都会报告 基础数据类型,而不是同义词。这个 元数据发生行为 操作,例如sp_help和其他 系统存储过程, 信息模式视图,或 各种数据访问API元数据 报告数据类型的操作 表或结果集列。
换句话说,当SMO获得关于表的元数据时,它只知道rowversion。这意味着具有rowversion类型列的表将作为Data Type Synonyms
返回到SMOSMO API从未赶上SQL Server使用的新命名。但由于该类型的基础行为没有改变,只有名称,您的SMO客户端代码不需要更改。
如果您的代码显示SQL Server数据类型,您可以成为一个好公民并更改该代码以显示“rowversion”而不是“timestamp”。但是否则你的代码根本不需要改变。实际上,大多数SMO客户端(Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp
)从未打扰过更改其UI以反映新命名。由于这些UI连接到封面下的枚举,因此无论SQL Server在DDL中调用哪种类型,SMO API客户端都将继续工作。
SMO API的未来版本可能也会为具有相同基础数值的枚举(例如Microsoft.SqlServer.Management.Smo.SqlDataType.RowVersion
)添加同义值,但鉴于现有客户端未被破坏,这可能是他们的优先级低。
答案 1 :(得分:1)
我找不到任何表示不推荐使用SqlDataType.Timestamp
的内容。您提供的链接表明,timestamp
的“rowversion
语法”在T-SQL中已弃用,您应该使用rowversion
,但是要由图书馆维护人员确保在他们的产品中实现了正确的语法。如果在将来的版本中实际删除了时间戳语法,那么我确信库将被更新,Timestamp
枚举值仍将向后兼容使用它的代码。由于它们不提供RowVersion
枚举值,因此我只使用Timestamp
。