【问题标题】:How do you convert VARCHAR to TIMESTAMP in MSSQL?如何在 MSSQL 中将 VARCHAR 转换为 TIMESTAMP?
【发布时间】:2010-09-16 12:15:19
【问题描述】:

您想调用 MS SQL 上的存储过程,该过程在 T-SQL 中具有 TIMESTAMP 参数类型,而不是使用 VARCHAR 值(例如“0x0000000002C490C8”)的 ADO.NET。

你是做什么的?

更新: 这是您收到“时间戳”值但仅作为 VARCHAR 存在的地方。 (想想另一个存储过程上的 OUTPUT 变量,但它已经固定为 VARCHAR,它只有一个 TIMESTAMP 的值)。因此,除非您决定构建动态 SQL,否则如何以编程方式将存储在 VARCHAR 中的值更改为有效的 TIMESTAMP?

【问题讨论】:

  • 该值是否类似于自纪元以来的毫秒数?
  • 不,它是数据库范围的唯一标识符。时间戳这个名字有点用词不当。它更类似于其他数据库所称的 rowid。
  • 好的,抱歉,MS SQL 的数据类型不如我应该的那样!
  • 没问题,我也很困惑。 (而且我在这里只能成为“西部最快的枪”,因为前几天我只是在为我继承的项目中的一张桌子做这项研究...... :)
  • 哦……更新让这变得更加棘手!

标签: sql-server tsql timestamp varchar


【解决方案1】:

TIMESTAMP 在语义上等同于 VARBINARY(8)(可为空)或 BINARY(8)(不可为空)。所以你应该可以调用不带引号的参数的过程,如下:

EXEC usp_MyProc @myParam=0x0000000002C490C8

另见SQL Books Online

编辑更新的问题...

我只是尝试了一些实验。坦率地说,我很好奇您是如何将其表示为 varchar 的,因为当我执行以下操作时:

select top 10 convert(varchar, ts) from foo

其中 ts 是时间戳,我得到 10 个空白行。 (如果我不转换,我会看到我的时间戳。)

但是,我尝试从正确的方向努力……我这样做了:

select convert(timestamp, '0x0000000000170B2E')

转换结果为0x3078303030303030。所以也不会玩。也不会转换为二进制。

我不想这么说,但您可能会陷入动态 SQL 世界。不过,我真的愿意犯错。

【讨论】:

  • 请查看更新后的问题。抱歉之前不清楚。想象一下获取一个作为 VARCHAR 传入的参数(但它里面有一个 TIMESTAMP 值)。那你会怎么做@myParam?
【解决方案2】:

时间戳数据类型由 SQL Server 管理。除了作为表格列类型之外,我从未见过它在任何地方使用过。在这种情况下,时间戳类型的列将为您提供与数据库中所有其他更新相关的行上最后一次插入/更新的严格序号。要查看整个数据库中最近的序号,您可以检索 @@DBTS 或 rowversion() 的值。

http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx

时间戳 (Transact-SQL)

是一种在数据库中公开自动生成的唯一二进制数的数据类型。时间戳通常用作对表行进行版本标记的机制。存储大小为 8 个字节。时间戳数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用 datetime 数据类型。

因此,时间戳列的 volatile 值无法设置,并且会在对该行进行任何修改时发生变化。但是,您可以将时间戳值冻结为 varbinary(8) 值。

例如,假设您有一个源表和一个目标表。

CREATE TABLE tblSource (
Id int not null
colData int not null
colTimestamp timestamp null)

CREATE TABLE tblTarget (
Id int not null
colData int not null
colTimestampVarBinary varbinary(8) null)

然后,在提取过程中,您可能希望捕获自上次运行提取过程以来更新的所有内容。

DECLARE @maxFrozenTargetTimestamp varchar(8)
SELECT @maxFrozenTargetTimestamp = max(colStamp) FROM tblTarget

INSERT tblTarget(Id, colData, colTimestampVarBinary)
SELECT 
Id
,colData
colTimestampVarBinary = convert(varbinary(8) colTimestamp)
FROM 
tblSource 
WHERE
tblSource.colTimestamp > @maxFrozenTargetTimestamp

如果您遇到问题,我的第一个猜测是您的问题的症结所在 是在将 varchar 转换为 varbinary(8),而不是时间戳类型。

更多信息(可能太多了),看我留给博文http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html?showComment=1213612020000的评论(倒数第四个)

【讨论】:

    【解决方案3】:

    由于时间戳与 varbinary 兼容,SQL Server 2008 中的解决方案将是:

    declare @hexstring varchar(max);
    set @hexstring = '0xabcedf012439';
    select CONVERT(varbinary(max), @hexstring, 1);
    
    set @hexstring = 'abcedf012439';
    select CONVERT(varbinary(max), @hexstring, 2);
    

    参考。 MSN Blogs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-10
      • 2015-06-27
      • 2012-10-07
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2019-08-12
      相关资源
      最近更新 更多