7

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

你做什么工作?

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

4

3 回答 3

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);

参考。MSN 博客

于 2011-11-29T19:53:13.703 回答
2

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

EXEC usp_MyProc @myParam=0x0000000002C490C8

另请参阅SQL 联机丛书

编辑更新的问题...

我只是尝试了一些实验。坦率地说,我很好奇你是如何把它表示为 varchar 的,因为当我做类似的事情时:

select top 10 convert(varchar, ts) from foo

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

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

select convert(timestamp, '0x0000000000170B2E')

并且转换导致0x3078303030303030. 所以也不会玩。也不会转换为二进制。

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

于 2008-10-10T13:07:40.313 回答
0

时间戳数据类型由 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

于 2008-10-20T22:53:48.457 回答