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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top