2013-11-14 46 views
0

比較圖像我知道這個線程:Comparing Image Data Types In SQL,但它是沒有幫助的我真的需要在SQL

我試着寫在T-SQL(SQL Server 2008中)觸發這將檢查圖像的一篇文章發生了變化,並在一些特殊的表格中報告。該數據庫使用Image數據類型,我無權更改它。

我想:

ALTER TRIGGER PhotoUPDATE        
ON ARTICLE          
FOR UPDATE   
AS    
DECLARE @ID numeric (18,0),@PHOTO_NEW image,@PHOTO_OLD image 

SET @ID = (SELECT ID FROM inserted) 
SET @PHOTO_NEW = (SELECT PHOTO FROM inserted) 
SET @PHOTO_OLD = (SELECT PHOTO FROM deleted) 

IF (@PHOTO_NEW<>@PHOTO_OLD) 
BEGIN 
INSERT PhotoCHANGED (ID,DATE) 
VALUES(@ID,GETDATE()) 
END 
GO 

我得到錯誤:

The text, ntext, and image data types are invalid for local variables.

當我試圖不變量:

IF ((SELECT PHOTO FROM inserted)<>(SELECT PHOTO FROM deleted)) 

我:

Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables.

我還能嘗試什麼?

+2

我不知道在SQL服務器中是否可行,但在Oracle中,我會爲兩個圖像(例如SHA1)計算哈希值並進行比較。 –

回答

4

你說

The database uses Image datatype and I'm not in power to change it.

井,你不能這樣做,那麼這種情況下。 image已棄用。不允許訪問inserted/deleted表中的image列。試圖這樣做將導致錯誤

Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables.

有可能通過查詢基表得到更新後的列值,但也沒有辦法讓DELETED.PHOTO值可進行對比。

您需要負責人將列數據類型更改爲varbinary(max)

ALTER TABLE ARTICLE ALTER COLUMN PHOTO VARBINARY(MAX) NOT NULL 

然後,您可以在觸發器內訪問它並比較相等性。

您的觸發器也被打破。更新可能會影響多行(或零)。並不總是完全一樣。

此外,您應該檢查IF UPDATE(PHOTO)跳過如果列未被觸及。

ALTER TRIGGER PhotoUPDATE 
ON ARTICLE 
FOR UPDATE 
AS 
    SET NOCOUNT ON; 

    IF UPDATE(PHOTO) 
     BEGIN 
      INSERT PhotoCHANGED 
       (ID, 
        DATE) 
      SELECT I.ID, 
       GETDATE() 
      FROM inserted I 
       JOIN DELETED D 
        ON I.ID = D.ID 
         AND EXISTS (SELECT I.PHOTO 
            EXCEPT 
            SELECT D.PHOTO) 
     END 
+0

感謝您帶來多行問題。實際上,在我的情況下,訪問此表的唯一方法是某個應用程序每次只向文章添加一張照片,因此它將成爲我的情況中的一行。但我會記得它並不總是。至於圖像,我決定改變程序的功能,如果它很難比較它們。無論如何,比較500KB的字節可能會顯着降低數據庫的速度。 – RRM