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

问题描述 投票:6回答:3

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

你做什么?

更新:这是您要获取“时间戳”值的地方,但仅作为VARCHAR存在。 (考虑在另一个存储的proc上使用OUTPUT变量,但是已经将其固定为VARCHAR,只是具有TIMESTAMP的值)。因此,除非您决定构建Dynamic SQL,否则如何以编程方式将VARCHAR中存储的值更改为有效的TIMESTAMP?

sql-server tsql timestamp varchar
3个回答
0
投票

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

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

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

因此,无法设置时间戳列的易失性值,并且在对该行进行任何修改时都可能发生变化。但是,您可以将时间戳记值冻结为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的评论(向下四分之一)>


4
投票

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


2
投票

时间戳在语义上等效于VARBINARY(8)(可为空)或BINARY(8)(不可为空)。因此,您应该能够使用未引用参数来调用该过程,如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.