標籤:
原文:.SQL Server中 image類型資料的比較
在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 ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION [dbo].[FuncCompareImage] ( @a1 IMAGE, @a2 IMAGE )RETURNS INT-- if match, return 1AS 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;
.SQL Server中 image類型資料的比較