SQL Server / .Net bug?

时间:2014-08-04 02:47:44

标签: 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]

插入一些数据后,将所有行更新为一个日期值以用于快照目的

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

1 个答案:

答案 0 :(得分:5)

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

是 - 您在一个语句中使用空DateUpdatedLast更新每一行。这会导致一次触发器执行,因此您的触发器必须处理inserted表中的多行。

这是触发器的常见错误,如果您只进行简单的一行测试,很容易错过它。

在您的情况下,您可以使用连接而不是子查询:

UPDATE si SET [WEB_SHOW] = 'Y' 
FROM [dbo].[STOCK_ITEMS] si 
JOIN inserted i on i.[STOCKCODE] = si.[STOCKCODE]