在SQL Server中如果你对text、ntext或者image数据类型的数据进行比较。将会提示:不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。不过image也是不支持like比较的。
那怎么样对数据库中的图片做比较呢。
对于这种大型对象的处理,在Oracle中有有专门的函数DBMS_LOB.COMPARE,而SQLSERVER中没有专门的处理函数,
只能通过使用substring函数一段一段的从image数据中截取放到varbinary类型数据,最长8060字节(8k),
然后再对varbinary类型数据进行比较。以下是一个比较image的函数例子:
注意:局部变量的类型是任何由系统提供的或用户定义的数据类型。变量不能是 text、ntext 或 image 数据类型,请在查询中直接使用。
/****** Object: UserDefinedFunction [dbo].[FuncCompareImage] Script Date: 2016-09-01 11:18:53 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[FuncCompareImage] ( @a1 IMAGE, @a2 IMAGE ) RETURNS INT -- if match, return 1 AS BEGIN DECLARE @n INT , @i INT , @j INT; DECLARE @b1 VARBINARY(8000) , @b2 VARBINARY(8000); SET @n = 1; IF DATALENGTH(@a1) <> DATALENGTH(@a2) -- different length SET @n = 0; ELSE BEGIN SET @i = 0; SET @j = ( DATALENGTH(@a1) - 1 ) / 8000 + 1; WHILE @i <= @j BEGIN SET @b1 = SUBSTRING(@a1, @i * 8000 + 1, CASE @i WHEN @j THEN DATALENGTH(@a1) % 8000 ELSE 8000 END); SET @b2 = SUBSTRING(@a2, @i * 8000 + 1, CASE @i WHEN @j THEN DATALENGTH(@a2) % 8000 ELSE 8000 END); IF @b1 <> @b2 BEGIN SET @n = 0; BREAK; END; SET @i = @i + 1; END; END; RETURN(@n); END;
时间: 2024-10-25 22:26:14