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?
由于时间戳与 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 博客
时间戳数据类型由 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
归档时间: |
|
查看次数: |
40284 次 |
最近记录: |