CREATE TABLE [dbo].[STOCK_WEB](
[STOCKCODE] [char](23) NOT NULL,
[SALES_HTML] [varchar](max) NULL,
[PICTURE_URL] [varchar](80) NULL,
[DESCRIPTION] [nvarchar](255) NULL,
[DateUpdatedLast] [smalldatetime] NULL CONSTRAINT [DF_STOCK_WEB_DateUpdated] DEFAULT (getdate()),
CONSTRAINT [PK__STOCK_WEB__094028A5] PRIMARY KEY CLUSTERED
(
[STOCKCODE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
插入一些数据后,将所有行更新为一个日期值以用于快照目的
UPDATE STOCK_WEB
SET DateUpdatedLast = getdate()
WHERE DateUpdatedLast is NULL
Msg 512,Level 16,State 1,Procedure insertwebshow,Line 6
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。 声明已经终止。
桌子上有一个触发器......
CREATE TRIGGER dbo.insertwebshow
ON [ADX].[dbo].[STOCK_WEB]
AFTER INSERT, UPDATE
AS
UPDATE [dbo].[STOCK_ITEMS]
SET [WEB_SHOW] = 'Y'
WHERE [STOCKCODE] = (Select [STOCKCODE] FROM inserted)
GO
触发器是否可以为整个更新语句返回多行?
这没有任何意义!
编辑:
在我得到更好的接受答案之前决定改变触发器:
CREATE TRIGGER dbo.insertwebshow
ON [ADX].[dbo].[STOCK_WEB]
AFTER INSERT, UPDATE
AS
UPDATE [dbo].[STOCK_ITEMS]
SET [WEB_SHOW] = 'Y'
WHERE [STOCKCODE] IN (SELECT [STOCKCODE] FROM inserted)
GO
答案 0 :(得分:5)
"触发器是否可以为整个更新语句返回多行?"
是 - 您在一个语句中使用空DateUpdatedLast
更新每一行。这会导致一次触发器执行,因此您的触发器必须处理inserted
表中的多行。
这是触发器的常见错误,如果您只进行简单的一行测试,很容易错过它。
在您的情况下,您可以使用连接而不是子查询:
UPDATE si SET [WEB_SHOW] = 'Y'
FROM [dbo].[STOCK_ITEMS] si
JOIN inserted i on i.[STOCKCODE] = si.[STOCKCODE]