Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在MSSQL中将VARCHAR转换为时间戳?_Sql Server_Tsql_Timestamp_Varchar - Fatal编程技术网

Sql server 如何在MSSQL中将VARCHAR转换为时间戳?

Sql server 如何在MSSQL中将VARCHAR转换为时间戳?,sql-server,tsql,timestamp,varchar,Sql Server,Tsql,Timestamp,Varchar,您希望调用MS SQL上的存储过程,该过程在T-SQL中具有时间戳参数类型,而不是使用VARCHAR值(例如“0x0000000002C490C8”)调用ADO.NET 你是做什么的 更新: 这里有一个“Timestamp”值,但它只作为VARCHAR存在。(考虑另一个存储过程上的输出变量,但它已经被固定为VARCHAR,它只有时间戳的值)。因此,除非您决定构建动态SQL,否则如何以编程方式将存储在VARCHAR中的值更改为有效的时间戳?时间戳在语义上等同于VARBINARY(8)(可空)或BI

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

你是做什么的

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

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

EXEC usp_MyProc @myParam=0x0000000002C490C8
另见

编辑更新的问题

我只是做了一些实验。坦白地说,我很好奇你是怎么把这个表示成一个varchar的,因为当我这样做的时候:

select top 10 convert(varchar, ts) from foo
其中ts是一个时间戳,我得到10个空白行。(如果我不转换,我会看到我的时间戳。)

然而,我试着从正确的方向去做。。。我这样做:

select convert(timestamp, '0x0000000000170B2E')
转换结果是
0x30783030303030
。所以这也不会起作用。转换为二进制也不会


我不想这么说,但您可能被困在一个动态的SQL世界中。不过,我真的很想出错。

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

时间戳(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),而不是转换为时间戳类型


有关更多信息(可能太多),请参阅我在博客帖子中留下的评论(第四条),因为时间戳与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);

参考资料

该值是否类似于自历元以来的毫秒数?不,它是数据库范围的唯一标识符。时间戳这个名字有点用词不当;它更类似于其他DBs所称的rowid。好吧,对不起,MS SQL的数据类型并不像我应该的那样好!没问题,我也很困惑。(我在这里只能成为“西方最快的枪”,因为前几天我只是在为我继承的一个项目中的一张桌子做这项研究…:)哦。。。更新使这变得更加棘手!请参阅更新的问题。对不起,以前不清楚。想象一下,获取一个作为VARCHAR传入的参数(但它内部有一个时间戳值)。那么,您将如何制作@myParam?