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,就像你说的,是一个计算,我希望将所有这些默认值保存在一个位置。尽管如此,我们还是很感激。希望这没有违反规定,但想问问你是否住在新斯科舍省?克利夫·罗宾逊:不,我在那里工作了三年后,就是蓝鼻子国家队的忠实粉丝——我在瑞士出生、长大(现在生活)