Gas*_*a79 14 t-sql sql-server sql-server-2008
我正在尝试使用TSQL(或SQL Server 2008)创建一个简单的触发器.问题是:我当前的触发器正在更新整个表.这很好,但是现在这个表有超过20k行.所以我想要一个只更新正在插入的行的触发器.
这是我目前的简单触发器:
CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
FOR INSERT
AS
Begin
Update Persons
set MyFile = NULL
where Len(MyFile) < 60
End
Run Code Online (Sandbox Code Playgroud)
我想我将不得不使用"插入"表或row_number主键排序的功能.有任何想法吗?
Mar*_*ith 21
如果有必要在这里使用触发器,我会使用INSTEAD OF触发器来调整预插入值,并避免需要JOIN返回基表并在之后更新它们.
CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO Persons
SELECT foo,
bar,
CASE
WHEN Len(MyFile) >= 60 THEN MyFile
END
FROM Inserted
END
Run Code Online (Sandbox Code Playgroud)
mar*_*c_s 17
您需要Inserted在UPDATE语句中加入伪表.始终要知道SQL Server会为每个语句触发一次触发器,并且该语句可以很好地一次修改/插入多行 - 因此您的Inserted表很可能包含多行 - 只需要在编写触发器时记住这一点.
尝试这样的事情:
CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
FOR INSERT
AS
UPDATE dbo.Persons
SET MyFile = NULL
WHERE Len(MyFile) < 60
AND PersonID IN (SELECT DISTINCT PersonID FROM Inserted)
Run Code Online (Sandbox Code Playgroud)
或者使用您必须使用的任何唯一列(您的主键)来准确获取已插入的行.
| 归档时间: |
|
| 查看次数: |
43894 次 |
| 最近记录: |