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

时间:2008-10-10 13:04:21

标签: sql-server tsql timestamp varchar

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

你做什么?

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

TIMESTAMP在语义上等同于VARBINARY(8)(可空)或BINARY(8)(不可为空)。因此,您应该可以使用参数unquoted调用该过程,如下所示:

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世界。不过,我真的喜欢错了。

答案 2 :(得分:0)

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

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

timestamp(Transact-SQL)

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

因此,无法设置timestamp列的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

的评论(第四篇)
相关问题