我编写了一个更新触发器,当我只更新一行但在更新多行时出错时,它可以正常工作。
错误:
消息512,级别16,状态1,过程Sale_OnUpdate,第14行子查询返回的值超过1。 当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
这是触发器
ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale]
AFTER Update
AS
Declare @ID as decimal
Declare @User as varchar(250)
Declare @Status as varchar(250)
set @ID = (Select ID from Inserted)
set @User = (Select UpdatedByUser from Inserted)
set @Status = Isnull((Select Status from Inserted),'')
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO [dbo].[Log]
(
[RecordID]
,[Date]
,[Time]
,[UserName]
,[TableName]
,[Action]
)
VALUES
(
@ID
,GetDate()
,GetDate()
,@User
,'Sale'
,'Update,' + @Status
)
END
我应该做些什么改变才能使它适用于多行。
答案 0 :(得分:1)
ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale]
AFTER Update
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO [dbo].[Log]
(
[RecordID]
,[Date]
,[Time]
,[UserName]
,[TableName]
,[Action]
)
SELECT
ID
,GetDate()
,GetDate()
,UpdatedByUser
,'Sale'
,'Update,' + Isnull(Status,'')
from Inserted
END
答案 1 :(得分:1)
试试这个
ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale]
AFTER Update
AS
as
if update (qty)
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;
/* check value of @@rowcount */
if @@rowcount = 1
INSERT INTO [dbo].[Log]
([RecordID]
, [Date]
, [Time]
, [UserName]
, [TableName]
, [Action])
SELECT id,
GETDATE(),
GETDATE(),
updatedbyuser,
'Sale',
'Update,' + ISNULL(status, '')
else
/* when rowcount is greater than 1,
use a group by clause */
begin
INSERT INTO [dbo].[Log]
([RecordID]
, [Date]
, [Time]
, [UserName]
, [TableName]
, [Action])
SELECT i.id,
GETDATE(),
GETDATE(),
i.updatedbyuser,
'Sale',
'Update,' + ISNULL(i.status, '')
FROM INSERTED i
and inserted.title_id = deleted.title_id
end
END
答案 2 :(得分:0)
使用:
ALTER TRIGGER [dbo].[Sale_OnUpdate] ON [dbo].[Sale]
AFTER Update
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO [dbo].[Log]
([RecordID]
, [Date]
, [Time]
, [UserName]
, [TableName]
, [Action])
SELECT i.id,
GETDATE(),
GETDATE(),
i.updatedbyuser,
'Sale',
'Update,' + ISNULL(i.status, '')
FROM INSERTED i
END
答案 3 :(得分:0)
我遇到了类似的问题,这里的想法是INSERTED表有很多记录,所以如果你想分析每个值,你需要通过示例使用游标迭代表: