残念ながら、Martin が提案したソリューションには欠陥があります。
検索キーのバイナリ シーケンスに任意の0x25
バイトが含まれている場合は、( ASCIIテーブル%
に従って) 文字に変換されます。
この文字は句内のワイルドカードとして解釈され、like
多くの望ましくない結果が表示されます。
-- A table with a binary column:
DECLARE @foo TABLE(BinCol VARBINARY(MAX));
INSERT INTO @foo (BinCol) VALUES (0x001125), (0x000011), (0x001100), (0x110000);
-- The search key:
DECLARE @key VARBINARY(MAX) = 0x1125; -- 0x25 is '%' in the ASCII table!
-- This returns ALL values from the table, because of the wildcard in the search key:
SELECT * FROM @foo WHERE
CONVERT(VARCHAR(max), BinCol) COLLATE Latin1_General_100_BIN2
LIKE ('%' + CONVERT(VARCHAR(max), @key) + '%');
この問題を解決するには、以下の検索句を使用します。
-- This returns just the correct value -> 0x001125
SELECT * FROM @foo WHERE
CHARINDEX
(
CONVERT(VARCHAR(max), @key),
CONVERT(VARCHAR(max), BinCol) COLLATE Latin1_General_100_BIN2
) > 0;