【发布时间】:2010-11-02 17:09:39
【问题描述】:
我有一个附加到表的触发器。
ALTER TRIGGER [dbo].[UpdateUniqueSubjectAfterInsertUpdate]
ON [dbo].[Contents]
AFTER INSERT,UPDATE
AS
BEGIN
-- Grab the Id of the row just inserted/updated
DECLARE @Id INT
SELECT @Id = Id
FROM INSERTED
END
每次插入或修改新条目时,我都希望更新单个字段(在此表中)。为了这个问题,假设我正在更新 LastModifiedOn (datetime) 字段。
好的,所以我有一个批量插入的东西..
INSERT INTO [dbo].[Contents]
SELECT Id, a, b, c, d, YouDontKnowMe
FROM [dbo].[CrapTable]
现在所有行都已正确插入。 LastModifiedOn 字段默认为空。所以这个的所有条目都是空的——除了第一行。
这是否意味着不会为插入到表中的每一行调用触发器,而是在插入查询完成后调用触发器,即。插入所有行?这意味着,INSERTED 表(在触发器中)不是一个,而是“n”行?!
如果是这样 .. 呃.. :( 这是否意味着我需要在此触发器中使用游标?(如果我需要对每一行执行一些独特的逻辑,我目前正在这样做)。
?
更新
我将添加完整的触发代码,看看是否可以在没有光标的情况下执行此操作。
BEGIN
SET NOCOUNT ON
DECLARE @ContentId INTEGER,
@ContentTypeId TINYINT,
@UniqueSubject NVARCHAR(200),
@NumberFound INTEGER
-- Grab the Id. Also, convert the subject to a (first pass, untested)
-- unique subject.
-- NOTE: ToUriCleanText just replaces bad uri chars with a ''.
-- eg. an '#' -> ''
SELECT @ContentId = ContentId, @ContentTypeId = ContentTypeId,
@UniqueSubject = [dbo].[ToUriCleanText]([Subject])
FROM INSERTED
-- Find out how many items we have, for these two keys.
SELECT @NumberFound = COUNT(ContentId)
FROM [dbo].[Contents]
WHERE ContentId = @ContentId
AND UniqueSubject = @UniqueSubject
-- If we have at least one identical subject, then we need to make it
-- unique by appending the current found number.
-- Eg. The first instance has no number.
-- Second instance has subject + '1',
-- Third instance has subject + '2', etc...
IF @NumberFound > 0
SET @UniqueSubject = @UniqueSubject + CAST(@NumberFound AS NVARCHAR(10))
-- Now save this change.
UPDATE [dbo].[Contents]
SET UniqueSubject = @UniqueSubject
WHERE ContentId = @ContentId
END
【问题讨论】:
-
更新的答案。不确定您要使用 COUNT(ContentId) 做什么,因为 WHERE 子句将其限制为 0 或 1 行
-
这里有没有回答你的问题?
-
干杯 - 回答。我所有的触发器现在都可以处理多个记录集 .. 他们应该 :) 而不是光标...
标签: sql sql-server tsql sql-server-2008 triggers