Eu tenho uma consulta que une duas tabelas com base em um timestamp
valor (não pergunte).
Uma dessas tabelas armazena os dados em uma coluna com um Timestamp
tipo de dados. O outro o armazena como um arquivo varchar
.
Anteriormente, a consulta convertia a timestamp
coluna em uma varchar
para a junção. Pelo que entendi, isso não pode ser sargável, então gostaria de fazer o contrário. (A timestamp
mesa é muito maior e a eficiência é mais um problema).
SELECT *
FROM TABLE1
INNER JOIN TABLE2
ON UPPER(master.dbo.fn_sqlvarbasetostr(cast(TimestampColumn as binary(8))))
= VARCHARTIMESTAMPCOLUMN
Eu tentei:
CONVERT(ROWVERSION, N'0x0000000003306BDD')
Nenhum erro, mas nenhuma correspondência na tabela (quando existe definitivamente uma linha).
CONVERT(ROWVERSION, CAST(N'0x0000000003306BDD' as bigint))
Isso dá um erro ao converter nvarchar
para bigint
.
Como posso converter o varchar
valor em um timestamp
em vez do contrário?
No SQL Server 2008, a conversão de binário para uma representação de caractere tornou-se muito mais rápida e fácil :
Observe a opção de estilo 1 no
CONVERT
tochar
. Além disso, orowversion
tipo é equivalente abinary(8)
(quando não anulável,varbinary(8)
caso contrário).Agora podemos criar um índice na coluna computada:
Adicione alguns dados de exemplo:
E exiba os resultados:
Exemplo de saída:
A tarefa de juntar à mesa com
rowversions
formato de caractere agora é trivial.Versão do SQL Server 2005
Isso requer uma função auxiliar:
A definição da tabela se torna:
Todo o resto procede como antes, incluindo o índice.