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

Bre*_*tra 6 t-sql sql-server varchar timestamp

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

你是做什么?

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

San*_*tos 5

由于时间戳与 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);
Run Code Online (Sandbox Code Playgroud)

参考。MSN 博客


6eo*_*son 0

时间戳数据类型由 SQL Server 管理。除了作为表列类型之外,我从未见过它在任何地方使用过。在这种情况下,时间戳类型的列将为您提供该行上最后一次插入/更新相对于数据库中所有其他更新的严格序数。要查看整个数据库中的最新序号,您可以检索 @@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)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息(可能太多),请参阅我在博客文章中留下的评论(倒数第四条)http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html ?showComment=1213612020000