Sql server 2008 SQL Server插入触发器以设置初始日期语法

Sql server 2008 SQL Server插入触发器以设置初始日期语法,sql-server-2008,triggers,Sql Server 2008,Triggers,我看过一些关于在INSERT触发器上更新的帖子。我的问题与此类似,但我对UPDATE语句的语法持谨慎态度,尤其是不理解一直被称为INSERTED的表 触发器代码只会更新INSERT上的一些日期列值(多亏了我在这里从您的一位大师那里找到的一些代码,才有了处理'shipdueDate'列的逻辑) 基于标识符设置,发票号已经存在递增值,因此当创建新行时,发票号将递增1。但是,为了使办公室管理员更容易添加发票数据,我认为在orderdate、shipduedate和dateinvoinced字段中放置一

我看过一些关于在
INSERT
触发器上更新的帖子。我的问题与此类似,但我对
UPDATE
语句的语法持谨慎态度,尤其是不理解一直被称为
INSERTED
的表

触发器代码只会更新
INSERT
上的一些日期列值(多亏了我在这里从您的一位大师那里找到的一些代码,才有了处理
'shipdueDate'
列的逻辑)

基于标识符设置,发票号已经存在递增值,因此当创建新行时,发票号将递增1。但是,为了使办公室管理员更容易添加发票数据,我认为在
orderdate
shipduedate
dateinvoinced
字段中放置一些初始值将更容易输入数据

这就是我想出的代码

   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人才。

如果您只关心
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
语句未明确将这些列设置为其他值。

首先让我解释一下INSERT(和deleted)的含义。在触发器中,有两个表,其中包含要插入或删除的数据。在更新中,旧值将被删除,新值将被插入。在“删除”对话框中,只填充“已删除”。在insert中,只填充inserted。现在需要记住的一点是,您永远不能依靠触发器在该文件中只插入或删除一条记录。如果在一条insert语句中插入100条记录,则inserted语句中有100条记录。因此,如果假设只有一条记录,代码将无法正常工作。提示是,您不应该将值从inserted设置为标量变量

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

比如:

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

非常感谢。为了理解:)-这个表“插入”来自哪里?它是一种SQL SVR机制,用来保存表的副本,实际上是对表执行删除和插入操作吗?此外,发票的主键是InvoiceID。我应该假设inv.id应该是InvoiceID=I.id还是Invoices.InvoiceID=I.InvoiceID?对不起,上面的问题是针对您@HLGEM的。我尝试添加inv.invoiceid=I.invoiceid的代码,但似乎不起作用。我是否应该尝试-->在inv.invoiceid=I.id上加入插入的I?非常欢迎您的澄清。Inserted与要插入的表具有相同的列名称。Inserted不是一个真正的表,但只能在触发器或查询的output子句中使用。@marc_-s-谢谢。对于只需要当前日期的字段,这是一个很好的选择。shipduedate,就像你说的,是一个计算,我希望将所有这些默认值保存在一个位置。尽管如此,我们还是很感激。希望这没有违反规定,但想问问你是否住在新斯科舍省?克利夫·罗宾逊:不,我在那里工作了三年后,就是蓝鼻子国家队的忠实粉丝——我在瑞士出生、长大(现在生活)