0

如何LIKE在具有时间戳(行版本)数据类型的列上使用运算符?

以下是我尝试过但没有运气的查询。

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

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

此外,我不能将单引号与时间戳值一起使用。

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

我想使用LIKE运算符找到行版本控制的模式。使用CAST我无法找到模式。

任何想法 ?

谢谢,

4

1 回答 1

1

Rowversion(其中时间戳是不推荐使用的同义词)是二进制数据类型。datetime与s无关。因此CAST,将值的十六进制字符串表示为 datetime/string 以执行 aLIKE将不起作用。您需要计算哪些二进制值将具有以输入字符串开头的十六进制字符串表示形式。

假设完整的 rowversion 十六进制字符串的长度为 18,那么您可以用0s 填充输入字符串的其余部分以获得应返回的最小值LIKE(如果它可以与十六进制字符串一起使用 - 它不能)。然后最大值将是一个带有Fs 的填充或添加(16 到被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

这将为您提供所需的结果,即对于and之间的0x000000000000E05所有内容,对于 and 之间的所有内容等。0x000000000000E0500x000000000000E05F0x000000000000E0x000000000000E0000x000000000000EFFF

然后,您可以根据需要将逻辑包装在 UDF 中。

于 2016-03-21T11:02:08.163 回答