Sha*_*lly 1 sql sql-server-2012
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]
Run Code Online (Sandbox Code Playgroud)
插入一些数据后,将所有行更新为一个日期值以进行快照
UPDATE STOCK_WEB
SET DateUpdatedLast = getdate()
WHERE DateUpdatedLast is NULL
Run Code Online (Sandbox Code Playgroud)
Msg 512,Level 16,State 1,Procedure insertwebshow,Line 6 Subquery
返回的值超过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
Run Code Online (Sandbox Code Playgroud)
触发器是否可以为整个更新语句返回多行?
这没有任何意义!
编辑:
在我得到更好的接受答案之前决定更改触发器:
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
Run Code Online (Sandbox Code Playgroud)
"触发器是否可以为整个更新语句返回多行?"
是的 - 您DateUpdatedLast在一个语句中使用null更新每一行.这会导致一个触发器执行,因此您的触发器必须处理inserted表中的多个行.
这是触发器的常见错误,如果您只进行简单的单行测试,很容易错过它.
在您的情况下,您可以使用连接而不是子查询:
UPDATE si SET [WEB_SHOW] = 'Y'
FROM [dbo].[STOCK_ITEMS] si
JOIN inserted i on i.[STOCKCODE] = si.[STOCKCODE]
Run Code Online (Sandbox Code Playgroud)