Como você converter VARCHAR para TIMESTAMP em MSSQL?
-
08-07-2019 - |
Pergunta
Você gostaria de chamar uma proc armazenados em MS SQL que tem um tipo de parâmetro de TIMESTAMP dentro de T-SQL, não ADO.NET usando um valor VARCHAR (por exemplo '0x0000000002C490C8').
O que você faz?
UPDATE: Este é o lugar onde você tem um valor "Timestamp" vêm em você, mas existe apenas como VARCHAR. (Pense variável de saída em outro proc armazenados, mas ele já está fixada como VARCHAR, ele só tem o valor de um timestamp). Então, a menos que você decidir construir SQL dinâmico, como você pode alterar programaticamente um valor armazenado em VARCHAR dentro de um timestamp válido?
Solução
A timestamp tipo de dados é gerenciado por SQL Server. Eu nunca vi isso usado em qualquer lugar que não seja como um tipo de coluna da tabela. Nessa qualidade, a coluna do tipo timestamp vai lhe dar um ordinal rigorosa do último insert / update em linha em relação a todas as outras atualizações no banco de dados. Para ver o ordinal mais recente em todo o banco de dados, você pode recuperar o valor de @@ DBTS ou rowversion ().
Por http://msdn.microsoft.com /en-us/library/ms182776(SQL.90).aspx
timestamp (Transact-SQL)
é um tipo de dados que expõe gerado automaticamente, números binários únicas dentro de um banco de dados. timestamp é geralmente utilizada como um mecanismo para as linhas da tabela de estampagem a versão. O tamanho de armazenamento é de 8 bytes. O tipo de dados timestamp é apenas um número incremental e não preservar uma data ou uma hora. Para gravar uma data ou hora, use um tipo de dados de data e hora.
Assim, o valor volátil de uma coluna timestamp não pode ser definido e está sujeita a mudanças a qualquer modifaction para a linha. Você pode, no entanto, congelar o valor timestamp para um valor varbinary (8).
Por exemplo, digamos que você tinha uma tabela de origem e uma tabela de destino.
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)
Então, em um processo de extração, você pode querer tudo de captura que foi atualizado desde a última vez que você executou o processo de extração.
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
Se você está tendo problemas, o meu primeiro palpite seria que cerne do seu problema é na conversão de um VARCHAR à varbinary (8), e não a um tipo timestamp.
Para mais informações (talvez demais), ver o comentário (quarta baixo) I esquerda para o post do blog http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html?showComment= 1213612020000
Outras dicas
Desde timestamp é compatível com varbinary a solução será isso no 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);
Referência. MSN Blogs
é um timestamp semanticamente equivalentes a VARBINARY (8) (nulo) ou binário (8) (não-nulo). Então você deve ser capaz de chamar o procedimento com o parâmetro não cotadas, como a seguir:
EXEC usp_MyProc @myParam=0x0000000002C490C8
Veja também SQL Books Online
EDIT para a pergunta atualizado ...
Eu apenas tentei algumas experiências. Francamente, estou curioso para saber como você se esta representado como um varchar em primeiro lugar, uma vez que quando eu faço algo como:
select top 10 convert(varchar, ts) from foo
Onde ts é um timestamp, recebo 10 linhas em branco. (Se eu não converter, eu vejo meus timestamps).
No entanto, eu tentei trabalhar para ele a partir da direção correta ... Eu fiz isso:
select convert(timestamp, '0x0000000000170B2E')
E a conversão resultou em 0x3078303030303030
. De modo que não vai jogar qualquer um. Nem a conversão para binário.
Eu odeio dizer isso, mas você pode ser preso em um mundo SQL dinâmico. Eu tinha realmente como estar errado, porém.