SQL Server INSERT触发器设置初始日期语法

时间:2012-04-03 17:12:49

标签: sql-server-2008 triggers

我查看了有关INSERT触发器更新的一些帖子。我的问题很相似,但我对UPDATE语句中的语法保持警惕,特别是不理解一直被称为INSERTED的表。

触发器代码将仅更新INSERT上的一些日期列值(并且由于我在这里找到的一些代码,你可以找到一个代码来处理'shipdueDate'列的逻辑)。

基于标识符设置的发票编号已经增加了值,因此当创建新行时,发票编号会增加1.但是,为了使办公室中的管理员更容易添加发票数据,我认为在orderdateshipduedatedateinvoiced字段中放置一些初始值可以更轻松地输入数据。

这是我提出的代码

   CREATE TRIGGER Invoices_SetInitialDates ON dbo.Invoices FOR INSERT
   AS 
   BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
  SET NOCOUNT ON;
      DECLARE @fromDate DATETIME
  DECLARE @shipDate DATETIME
  DECLARE @daysToAdd int
    -- We promise a 7 day turn-around on orders, so it has to 
    -- ship on the 8th day
  SELECT @fromDate = CURRENT_TIMESTAMP, @DaysToAdd = 8
  SET datefirst 1

    -- code from stackoverflow to calculate the shipduedate based
    -- on week days. It doesn't have any logic for holidays, but it
    -- provides the Admin initial values to work with, and that she 
    -- can change in the new record.
      SELECT @shipDate =
        DATEADD(day,
        @daysToAdd%5 +
         CASE DATEPART(weekday,@fromDate) + @daysToAdd%5
           WHEN 6 THEN 2
           WHEN 7 THEN 1
         ELSE 0 END,
         DATEADD(week,@daysToAdd/5,@fromDate)
       )

       -- UPDATE statement for trigger here. I'm not sure
       -- here about a table called INSERTED, or if this will
       -- simply update the newly added record. This is where
       -- I believe I need guidance.
         UPDATE dbo.Invoices SET DateOrdered = @fromDate
         ,ShipDueDate = @shipDate
         ,DateInvoiced = @fromDate

       END
       GO

提前致谢。这是一个很棒的网站,拥有大量的SQL Server人才。

2 个答案:

答案 0 :(得分:2)

如果您只关注INSERT,那么绝对不需要触发器 - 只需为您的列定义默认值!

ALTER TABLE dbo.Invoices
ADD CONSTRAINT DF_Invoices_DateOrdered DEFAULT (GETDATE()) FOR DateOrdered

ALTER TABLE dbo.Invoices
ADD CONSTRAINT DF_Invoices_DateInvoiced DEFAULT (GETDATE()) FOR DateInvoiced

ShipDueDate及其计算逻辑是一项棘手的业务 - 但也许您可以简化它,以便您也可以将其定义为默认约束。

默认约束为INSERT 上的列提供值,但前提是INSERT语句未明确将这些列设置为其他值。

答案 1 :(得分:0)

让我解释一下插入(和删除)。在触发器中,您可以使用两个表,其中包含要插入或删除的数据。在更新中,旧值将被删除,新值将被插入。在删除中仅填充已删除的内容。在插入中仅填充插入。否则要记住的关键是你永远不能依赖于触发器只插入或删除一条记录。如果在一个insert语句中插入了100条记录,则插入了100条记录。因此,如果您只假设一条记录,代码将无法正常工作。一个线索是,您不应该将插入的值设置为标量变量。

您的触发器需要加入以插入更新语句,因为它现在将使用新日期更新表中的每条记录。

类似的东西:

UPDATE inv
SET DateOrdered = @fromDate          
    ,ShipDueDate = @shipDate          
    ,DateInvoiced = @fromDate  
From dbo.Invoices inv
join inserted i on inv.id = i.id