我创建了一个简单的触发器:
ALTER TRIGGER [dbo].[idlist_update] ON [dbo].[Store]
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @brand varchar(50);
DECLARE @model varchar(50);
DECLARE @category varchar(100);
DECLARE @part varchar(100);
DECLARE @count int;
SELECT @count = COUNT(*) FROM inserted;
SELECT @brand=Brand, @model=Model, @category=AClass, @part=Descript FROM inserted;
EXECUTE GenerateId_Part @brand, @model, @category, @part;
END
对于由我们的用户(他们使用特殊应用程序)修改的行,它可以正常工作,但我需要将其应用于表中的所有行(超过200.000+)。我试过了:
UPDATE Store SET lastupd={fn NOW()};
但它不起作用。
答案 0 :(得分:1)
我相信你想要的语法是:
UPDATE dbo.Store SET lastupd = CURRENT_TIMESTAMP;
但是,如果您每次插入或更新单行时更新整个表格,这对我来说似乎相当浪费。为什么不在其他地方存储一次这个事实,而不是将其冗余存储200,000次?它似乎是商店本身的财产,而不是商店中的产品。
另请注意,您的触发器无法正确处理多行操作。你不能这样做“从inserted
”技巧中分配一个变量,因为如果一个语句插入两行,你只会影响一个任意行。与某些平台不同,在SQL Server中触发fire per statement ,而不是每行。如果您显示存储过程GenerateId_Part
的作用,我们可以帮助您解决此问题。