0

我创建了一个简单的触发器:

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()};

但它不起作用。

4

1 回答 1

1

我相信你想要的语法是:

UPDATE dbo.Store SET lastupd = CURRENT_TIMESTAMP;

但是,如果每次插入或更新单行时都更新整个表,这对我来说似乎很浪费。为什么不将这个事实存储一次,在其他地方,而不是冗余存储 200,000 次?它似乎是商店本身的财产,而不是其中的产品。

另请注意,您的触发器无法正确处理多行操作。您不能执行此“从变量分配inserted”技巧,因为如果单个语句插入两行,则只会影响任意一行。与某些平台不同,在 SQL Server 中,触发器按语句触发,而不是按行触发。如果您显示存储过程的作用,我们可以帮助解决此GenerateId_Part问题。

于 2013-03-03T18:10:11.053 回答