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

Sql server 我真的需要在SQL中比较图像,sql-server,image,sql-server-2008,tsql,Sql Server,Image,Sql Server 2008,Tsql,我知道这条线索:但它没有帮助 我正在尝试在T-SQLServer2008中编写一个触发器,它将检查文章的图像是否已更改,并在某个特殊表中报告它。数据库使用图像数据类型,我无权更改它 我试过: ALTER TRIGGER PhotoUPDATE ON ARTICLE FOR UPDATE AS DECLARE @I

我知道这条线索:但它没有帮助

我正在尝试在T-SQLServer2008中编写一个触发器,它将检查文章的图像是否已更改,并在某个特殊表中报告它。数据库使用图像数据类型,我无权更改它

我试过:

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))
我得到:

无法在“已插入”和“已删除”表中使用文本、ntext或图像列

我还能试什么呢?

你说呢

数据库使用图像数据类型,我无权更改它

如果那样的话,你就不能这么做了。图像已弃用。不允许访问插入/删除表中的图像列。尝试执行此操作将导致错误

无法在“插入的”和中使用文本、ntext或图像列 “已删除”表

可以通过查询基表来获取更新后的列值,但无法获取要与之比较的DELETED.PHOTO值

您需要让负责人将列数据类型更改为varbinarymax

然后您可以在触发器内部访问它,并比较是否相等

你的扳机也坏了。更新可能会影响多行或零行。不总是一个

此外,如果未触碰该列,则应选中跳过该操作

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 
你说

数据库使用图像数据类型,我无权更改它

如果那样的话,你就不能这么做了。图像已弃用。不允许访问插入/删除表中的图像列。尝试执行此操作将导致错误

无法在“插入的”和中使用文本、ntext或图像列 “已删除”表

可以通过查询基表来获取更新后的列值,但无法获取要与之比较的DELETED.PHOTO值

您需要让负责人将列数据类型更改为varbinarymax

然后您可以在触发器内部访问它,并比较是否相等

你的扳机也坏了。更新可能会影响多行或零行。不总是一个

此外,如果未触碰该列,则应选中跳过该操作

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 

我不知道这在SQL server中是否可行,但在Oracle中,我会计算两个映像(例如SHA1)的哈希值并进行比较。我不知道这在SQL server中是否可行,但在Oracle中,我会计算两个映像(例如SHA1)的哈希值并进行比较。感谢您带来多行问题。实际上,在我的例子中,访问这个表的唯一方法是某个应用程序一次向文章中添加一张照片,所以在我的例子中它将是一行。但我会记得,并非总是这样。至于图像,如果比较起来很困难,我决定改变程序的功能。比较500 kB的字节可能会大大降低数据库的速度。感谢您带来多行问题。实际上,在我的例子中,访问这个表的唯一方法是某个应用程序一次向文章中添加一张照片,所以在我的例子中它将是一行。但我会记得,并非总是这样。至于图像,如果比较起来很困难,我决定改变程序的功能。无论如何,比较500 kB的字节可能会大大降低数据库的速度。