2016-03-21 2 views
0

Comment utiliser l'opérateur LIKE sur une colonne ayant un type de données timestamp (rowversion)?Opérateur LIKE sur la colonne d'horodatage, SQL Server

Voici les requêtes que j'ai essayées mais pas de chance.

-- no data is fetched using this SQL 
SELECT * FROM TAB 
WHERE tRowVersion LIKE '0x000000000000E05%' 

-- incorrect syntax near % 
SELECT * FROM TAB 
WHERE tRowVersion LIKE 0x000000000000E05% 

De même, je ne peux pas utiliser les guillemets simples avec les valeurs d'horodatage.

-- implicit conversion from data type varchar to timestamp is not allowed 
SELECT * FROM TAB 
WHERE tRowVersion = '0x000000000000E05' 

Je voudrais trouver les motifs de versioning de ligne utilisant l'opérateur LIKE. Utilisation CAST Je ne suis pas en mesure de trouver les modèles.

Une idée?

Merci,

+0

peut-être qu'il me manque quelque chose mais comment 'rowversion' est-il une colonne' timestamp'? – Utsav

+0

@Utsav, le nom de colonne actuel est tRowVersion avec le type de données d'horodatage. – Aditya

+0

mais qu'en est-il des valeurs hexadécimales? Le stockez-vous de cette façon? Ou ils sont juste affichés comme ça. – Utsav

Répondre

1

rowversion (dont l'horodatage est un synonyme obsolète) est un type de données binaire. Cela n'a rien à voir avec datetime s. En tant que tel CAST la représentation chaîne hexadécimale des valeurs à datetime/chaîne afin d'effectuer un LIKE ne fonctionnera pas. Vous devez calculer à la place quelles valeurs binaires auront des représentations hexadécimales commençant par la chaîne d'entrée.

En supposant une longueur de 18 pour la chaîne hexagonale pleine rowversion pad vous pourriez alors le reste de votre chaîne d'entrée avec 0 s pour obtenir la valeur minimale du LIKE doit retourner (étaient à travailler avec des chaînes hexagonales - dont il doesn 't). La valeur maximale serait alors soit un tampon avec F s ou un cas d'ajout (16 à la puissance du nombre de caractères étant filtré par le LIKE-1):

DECLARE @string_to_like varchar(18) = '0x000000000000E05' 

DECLARE @chars_to_like int 
SELECT @chars_to_like = 18 - len(@string_to_like) 

DECLARE @min_rowversion_s varchar(18) 
SET @min_rowversion_s = left(ltrim(@string_to_like) + '00000000000000000', 18) 

DECLARE @min_rowversion varbinary(8) 
SET @min_rowversion = CONVERT(varbinary(8), @min_rowversion_s, 1) 

DECLARE @max_value INT 
DECLARE @divider int 

SET @divider = POWER(16, @chars_to_like) 

SELECT @max_value = @min_rowversion + @divider - 1 

SELECT * FROM TAB WHERE tRowVersion BETWEEN @min_rowversion AND @max_value 

Cela vous obtenir les résultats que vous besoin d'exemple pour tout 0x000000000000E05 entre 0x000000000000E050 et 0x000000000000E05F, pour tout 0x000000000000E entre 0x000000000000E000 et 0x000000000000EFFF etc.

Vous pouvez ensuite envelopper la logique dans une UDF si nécessaire.

+0

Excellent. Fonctionne bien pour moi. Merci pour les efforts;) – Aditya