0

我们有两个表:一个包含产品,另一个包含订单信息。

CREATE TABLE [dbo].[ORDERS] 
  ( 
     [ROW]           [BIGINT] IDENTITY(1, 1) NOT NULL, 
     [ID]            [UNIQUEIDENTIFIER] NOT NULL, 
     [RETAILER_ID]   [UNIQUEIDENTIFIER] NOT NULL, 
     [INDIVIDUAL_ID] [UNIQUEIDENTIFIER] NOT NULL, 
     [PRODUCT_ID]    [UNIQUEIDENTIFIER] NOT NULL, 
     [QUANTITY]      [BIGINT] NOT NULL, 
     [DATE]          [DATETIME] NOT NULL, 
     [MEMO]          [NVARCHAR](MAX) NULL 
  ) 
ON [PRIMARY] 
TEXTIMAGE_ON [PRIMARY] 

CREATE TABLE [dbo].[PRODUCTS] 
  ( 
     [ROW]         [BIGINT] IDENTITY(1, 1) NOT NULL, 
     [ID]          [UNIQUEIDENTIFIER] NOT NULL, 
     [RETAILER_ID] [UNIQUEIDENTIFIER] NOT NULL, 
     [NAME]        [NVARCHAR](255) NOT NULL 
  ) 
ON [PRIMARY] 

我们需要修复此触发器,以便当产品名称更改时,订单表中的备注字段需要在订单表中对更改进行备注。所以这是我们设计的触发器,但我们收到错误“无法绑定多部分标识符“o.Memo”。”

这是产生错误的触发器?我们哪里出了问题?

CREATE TRIGGER DBO.PRODUCTS_NAME_CHG 
ON DBO.PRODUCTS 
AFTER UPDATE 
AS 
  BEGIN 
      -- SET NOCOUNT ON added to prevent extra result sets from 
      -- interfering with SELECT statements. 
      DECLARE @old NVARCHAR(255), 
              @new NVARCHAR(255), 
              @ID  UNIQUEIDENTIFIER 

      SELECT @ID = ID, 
             @old = NAME 
      FROM   DELETED 

      SELECT @NEW = NAME 
      FROM   INSERTED 

      SET NOCOUNT ON; 

      IF UPDATE (NAME) 
        BEGIN 
            UPDATE DBO.ORDERS 
            SET    o.MEMO = o.MEMO + ' ' + @OLD + ' HAS CHANGED NAME TO ' + @NEW 
                            + '. ' 
            FROM   ORDERS o 
                   INNER JOIN PRODUCTS P 
                           ON P.ID = O.PRODUCT_ID 
            WHERE  P.ID = @ID 
        END 
  END 

GO 
4

1 回答 1

3

那么,使用内部连接进行更新的语法应该是

UPDATE o -- use alias here, not table name.
  SET o.Memo = --blabla
  FROM Orders o
  INNER JOIN --blabla
于 2013-09-02T19:24:19.117 回答