0

LIKEタイムスタンプ (rowversion) データ型を持つ列で演算子を使用するにはどうすればよいですか?

以下は私が試したクエリですが、うまくいきませんでした。

-- 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 (timestamp は非推奨のシノニム) はバイナリ データ型です。Sとは関係ありませんdatetime。そのCASTため、実行するために値の 16 進文字列表現を datetime/string に変換しても機能しLIKEません。代わりに、入力文字列で始まる 16 進文字列表現を持つバイナリ値を計算する必要があります。

完全な rowversion 16 進文字列の長さが 18 であると仮定すると、入力文字列の残りの部分を0s で埋めて、返される最小値を取得できますLIKE(16 進文字列で動作する場合は、そうではありません)。最大値は、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

これにより、 と の間のすべて、との0x000000000000E05間のすべてなど、必要な結果が得られます。0x000000000000E0500x000000000000E05F0x000000000000E0x000000000000E0000x000000000000EFFF

その後、必要に応じてロジックを UDF にラップできます。

于 2016-03-21T11:02:08.163 に答える