如何在具有时间戳(rowversion)数据类型的列上使用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
我无法找到模式。
有什么想法吗?
谢谢,
答案 0 :(得分:1)
Rowversion(其中timestamp是不推荐使用的同义词)是二进制数据类型。它与CAST
无关。因此LIKE
将值的十六进制字符串表示为datetime / string以执行0
将不起作用。您需要计算哪个二进制值将具有以输入字符串开头的十六进制字符串表示。
假设整个rowversion十六进制字符串的长度为18,那么您可以使用LIKE
填充输入字符串的其余部分,以获得F
应返回的最小值(是否可以工作)用十六进制字符串 - 它没有&#t; t)。然后,最大值可以是LIKE
s的填充或添加的情况(16为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
- 1过滤的字符数量的幂):
0x000000000000E05
这可以为您提供所需的结果,即0x000000000000E050
0x000000000000E05F
和0x000000000000E
之间的所有内容,0x000000000000E000
0x000000000000EFFF
和{{1}之间的所有内容等等。
然后,您可以根据需要将逻辑包装在UDF中。