代码之家  ›  专栏  ›  技术社区  ›  Brett Veenstra

如何在MSSQL中将VARCHAR转换为TIMESTAMP?

  •  8
  • Brett Veenstra  · 技术社区  · 17 年前

    您希望在T-SQL中调用一个参数类型为TIMESTAMP的MS SQL存储过程,而不是ADO。NET使用VARCHAR值(例如“0x00000002C490C8”)。

    你是做什么的?

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

    3 回复  |  直到 17 年前
        1
  •  5
  •   Sanchitos    14 年前

    由于时间戳与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

        2
  •  2
  •   John Rudy    17 年前

    TIMESTAMP在语义上等价于VARBINARY(8)(可以为空)或BINARY。因此,您应该能够调用参数未加引号的过程,如下所示:

    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世界。我愿意 真正地 不过,我喜欢犯错。

        3
  •  0
  •   vincent PHILIPPE 6eorge Jetson    6 年前

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

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

    时间戳(Transact-SQL)

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

    因此,时间戳列的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