2016-03-21 25 views
0

タイムスタンプ(rowversion)データ型を持つ列でLIKE演算子を使用するにはどうすればよいですか?タイムスタンプ列の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' 

Iは、LIKE演算子を使用して行のバージョン管理のパターンを見つけたいです。 CASTを使用しています。パターンを見つけることができません。

おかげで、(タイムスタンプは推奨同義語となっている)

+0

私は何か不足しているかもしれませんが、 'rowversion'は' timestamp'カラムとは何ですか? – Utsav

+0

@Utsav、実際の列名はタイムスタンプデータ型のtRowVersionです。 – Aditya

+0

ですが、16進数ではどうなりますか?そのように保管していますか?または、それはちょうどそれのように表示されます。 – Utsav

答えて

1

Rowversionはバイナリデータ型です。それはdatetimeとは関係ありません。そのようにを実行すると、LIKEを実行するためのdatetime/stringの値の16進文字列表現は機能しません。代わりに、どのバイナリ値が入力文字列から始まる16進文字列表現を持つかを計算する必要があります。フルrowversionの16進文字列のための18の長さを想定し

は、あなたは(それが進文字列で動作するように0 sのあなたの入力文字列の残りのうちパッドLIKEが返す最小値を取得するためだった可能性 - それはdoesnのどの't)。最大値は、F sのパッドまたは(LIKEによってフィルタリングされる文字の量の電力に16 - 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 

これはあなたの結果、あなたになるだろうあなたはその後、必要に応じてUDF内のロジックをラップすることができ0x000000000000E0000x000000000000EFFFなど

0x000000000000Eすべてのために、0x000000000000E0500x000000000000E05F0x000000000000E05すべてのために、すなわち必要です。

+0

優秀な答え:)。私のためにうまく動作します。努力をありがとう;) – Aditya