我真的需要在SQL中比较图像

时间:2013-11-14 12:17:19

标签: sql-server image sql-server-2008 tsql

我知道这个帖子:Comparing Image Data Types In 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

我收到错误:

  

text,ntext和image数据类型对局部变量无效。

当我尝试没有变量时:

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

我得到了:

  

不能在'inserted'和'deleted'表中使用text,ntext或image列。

我还能尝试什么?

1 个答案:

答案 0 :(得分:4)

你说

  

数据库使用Image数据类型,我无权更改它。

那么在那种情况下你不能这样做。不推荐使用image。不允许访问image / inserted表中的deleted列。试图这样做会导致错误

  

不能在'inserted'中使用text,ntext或image列   '删除'表。

可以通过查询基表来获取更新后列值,但无法获取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