SQL Server/.Net bug?

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)

Blo*_*ard 5

"触发器是否可以为整个更新语句返回多行?"

是的 - 您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)