代码之家  ›  专栏  ›  技术社区  ›  Daniel Schaffer

是否有包含rowversion值的microsoft.sqlserver.management.smo.sqldatatype替代方案?

  •  2
  • Daniel Schaffer  · 技术社区  · 14 年前

    这个 Microsoft.SqlServer.Management.Smo.SqlDataType 枚举的值 timestamp 类型但不 rowversion . 我正在查找程序集的更新版本或支持它的备用枚举类型。

    现有枚举的值为 Timestamp 但是根据 rowversion documentation , 时间戳 是“已弃用,将在未来版本中删除”。我宁愿避免使用不推荐使用的东西:)

    2 回复  |  直到 14 年前
        1
  •  5
  •   Justin Grant    14 年前

    快速回答:

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

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

    长回答:

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

    此数据类型[行版本]是 在SQL Server 2000中引入到 最终替换时间戳数据 类型。在ansi-sql定义中, 时间戳定义为日期和 微软实施的时间 作为一个二进制值, 行更改的时间。微软有 警告使用时间戳将 最终改为坚持 美国国家标准学会标准 并发管理应该是 避免。当前,时间戳和 rowversion类似于 其他…

    请注意,Oracle和Postgres都以符合标准的方式使用时间戳,因此,Microsoft明智地放弃时间戳的非标准用法,以避免使Oracle开发人员在SQL Server上工作变得更加困难。

    不管怎样,从 时间戳 划线 只是名义上的。它不会影响使用该类型的列的行为。根据msdn文档 划线 :

    时间戳是 rowversion数据类型并受 数据类型同义词的行为。在 ddl语句,请改用rowversion 尽可能使用时间戳。为了 更多信息,请参见 Data Type Synonyms (Transact-SQL).

    如果你深入研究这些文件 Data Type Synonyms :

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

    换句话说,当SMO得到关于表的元数据时,它只知道rowversion。这意味着具有rowversion类型的列的表将作为 Microsoft.sqlserver.management.smo.sqldatatype.timestamp

    SMoAPI从未赶上过SQL Server使用的新命名。但是由于类型的底层行为没有改变,只有名称,所以您的SMO客户机代码不需要改变。

    如果代码显示的是SQL Server数据类型,那么您可以是一个好公民,并将代码更改为显示“rowversion”而不是“timestamp”。但是,否则您的代码根本不需要更改。事实上,大多数SMO客户机( including Visual Studio's table design tool! )甚至都不想更改用户界面来反映新的命名。因为这些UI连接到覆盖下的枚举,所以无论SQL Server如何调用DDL中的类型,SMOAPI客户端都将继续工作。

    SMOAPI的未来版本可能还会向枚举添加同义值(例如 Microsoft.SqlServer.Management.Smo.SqlDataType.RowVersion )具有相同的基础数值,但考虑到现有客户机没有损坏,这可能是它们的低优先级。

        2
  •  1
  •   Zach Johnson    14 年前

    我什么也找不到 SqlDataType.Timestamp 已弃用。您提供的链接表示 timestamp 语法“for” rowversion 在T-SQL中已弃用,应使用 划线 相反,但库维护人员必须确保在其产品中实现正确的语法。如果在将来的版本中时间戳语法被删除,那么我确信库将被更新,并且 Timestamp 枚举值仍将与使用它的代码向后兼容。因为他们没有提供 RowVersion 枚举值,我只使用 时间戳 .

    推荐文章