4

我正在尝试查找所有不以幻数 ff d8 ff e0开头的图像(jpg 的签名)根据MSDN,我应该能够在我的数据上使用 patindex。然而

SELECT TOP 1000 [cpclid]
FROM [cp]
where patindex('FFD8FFE0%', cpphoto) = 0 -- cpphoto is a column type of image

给我错误

消息 8116,级别 16,状态 1,第 1 行参数数据类型图像对于 patindex 函数的参数 2 无效。

找到与幻数不匹配的记录的正确方法是ff d8 ff e0什么?

更新

这是一个链接,用于测试您的任何建议。


I Ross 的解决方案最终对查询内容进行了一些调整。

SELECT [cpclid]
  FROM [cp]
where convert(varchar(max), cast(cpphoto as varbinary(max))) not like convert(varchar(max), 0xFFD8FFE0 ) + '%'

我找到了更好的解决方案,请参阅我的答案。

4

3 回答 3

7

我找到了一个更简单的解决方案,运行速度更快。

SELECT [cpclid] 
FROM [cp]
where cast(cpphoto as varbinary(4)) <> 0xFFD8FFE0
于 2011-08-01T20:24:14.990 回答
6

为什么还在使用 IMAGE 数据类型?它已被弃用,取而代之的是 VARBINARY(MAX)...如果您将列转换为 VARBINARY(MAX),我认为您会发现它更容易使用。

编辑

在 SQL Server 2008 中,您可以使用更简单的转换:

SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), cpphoto), 2) FROM cpphoto;

事实上,这在您的 StackExchange 查询上工作得很好(我怀疑后端没有使用 SQL Server 2005)。

但我很高兴我的回答对你毫无用处。自记。

于 2011-08-01T17:00:36.770 回答
2

where cpphoto not like 'FFD8FFE0%'在你的where子句中使用。

cpphoto 转换为 avarchar(max)如果它还不是字符串。

于 2011-08-01T16:54:37.350 回答