2012-04-03 3 views
1

Ich habe einige Posts in Bezug auf die Aktualisierung auf einem INSERT Trigger untersucht. Meine Frage ist ähnlich, aber ich warne meine Syntax auf der UPDATE Aussage, besonders nicht, eine Tabelle zu verstehen, die immer als INSERTED bezeichnet wird.SQL Server INSERT-Trigger zum Festlegen der Anfangsdatensyntax

Der Trigger-Code wird nur einige Datumsspaltenwerte auf INSERT aktualisieren (und dank eines Codes, den ich hier von einem Ihrer Gurus gefunden habe, gibt es eine Logik für die 'shipdueDate' Spalte).

Es gibt bereits einen erhöhten Wert für die Rechnungsnummer basierend auf einer ID-Einstellung. Wenn eine neue Zeile erstellt wird, wird die Rechnungsnummer um 1 erhöht. Dies wird jedoch für einen Administrator im Büro einfacher Um Rechnungsdaten hinzuzufügen, dachte ich, dass das Platzieren einiger Anfangswerte in den Feldern orderdate, shipduedate und dateinvoiced eine einfachere Dateneingabe ermöglichen würde.

Dies ist der Code, den ich mit

im Voraus
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 

Dank habe kommen. Dies ist eine großartige Site mit vielen SQL Server-Talenten.

Antwort

2

Wenn Sie nur über INSERT besorgt sind, dann gibt es absolut keine Notwendigkeit für einen Trigger - einfach defaults für Ihre Spalten definieren!

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 

Die ShipDueDate mit seiner Berechnungslogik ist ein bisschen ein heikler Geschäft - aber vielleicht können Sie, dass vereinfachen, so dass Sie es als Standardeinschränkung definieren kann, auch.

Standardeinschränkungen bieten Werte Ihre Spalt auf INSERT, aber nur, wenn die INSERT Anweisung die Spalten auf einen anderen Wert nicht explizit festgelegt.

+0

@ marc_s - Danke. Dies ist eine gute Alternative für Felder, die nur das aktuelle Datum benötigen. Das Shipduedate, wie du sagst, ist eine Berechnung und ich hoffe, dass all diese Standardwerte an einem einzigen Ort aufbewahrt werden. Trotzdem ist es geschätzt. Hoffe, das ist keine Regel brechen, aber wollte fragen, ob Sie in Nova Scotia leben? Ich frage, nur weil ich dort geboren bin. –

+0

@CliffRobinson: Nein, nur ein großer Fan von Bluenose Land, nachdem ich dort für drei Jahre gearbeitet habe - ich wurde geboren und aufgewachsen (und lebe jetzt) ​​in der Schweiz –

0

Lassen Sie mich erklären über eingefügt (und gelöscht). In einem Trigger haben Sie zwei Tabellen zur Verfügung, die die Daten enthalten, die Sie einfügen oder löschen wollen. Bei einem Update werden die alten Werte gelöscht und die neuen Werte eingefügt. Bei einem Löschvorgang wird nur gelöscht gelöscht. In einem Insert wird nur eingefügt eingefügt. Es ist wichtig, sich daran zu erinnern, dass Sie sich niemals darauf verlassen können, dass nur ein Datensatz in diesen eingefügt oder gelöscht wird. Wenn Sie 100 Datensätze in eine Insert-Anweisung eingefügt haben, werden 100 Datensätze eingefügt. Daher wird Code nicht ordnungsgemäß funktionieren, wenn Sie nur einen Datensatz annehmen. Ein Hinweis ist, dass Sie keinen Wert von eingefügt in eine skalare Variable setzen sollten.

Ihr Trigger muss hinzugefügt werden, um in die Update-Anweisung eingefügt, als würde es jetzt jeden Datensatz in der Tabelle mit den neuen Daten aktualisieren.

so etwas wie:

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

Vielen Dank. Also in einem Versuch zu verstehen :) - kommt diese Tabelle 'eingefügt' von wo? Ist es ein SQL-SVR-Mechanismus, um eine Kopie der Tabelle zu halten, die im Wesentlichen ein Löschen und Einfügen gegen?Auch die PK für Rechnungen ist InvoiceID. Sollte ich annehmen, dass inv.id InvoiceID = i.id sein sollte oder sollte es Invoice.InvoiceID = i.InvoiceID sein? –

+0

Entschuldigung, die obige Frage ist an Sie adressiert @HLGEM. Ich habe versucht, den Code mit inv.invoiceid = i.invoiceid hinzuzufügen, und das schien nicht zu funktionieren. Sollte ich versuchen -> beitreten eingefügt ich auf inv.invoiceid = i.id? Ihre Klarstellung wäre sehr willkommen. –

+0

Eingefügt hat dieselben Spaltennamen wie die Tabelle, in die eingefügt wird. Inserted ist keine echte Tabelle, sondern nur für Sie in einem Trigger oder der output-Klausel einer Abfrage verfügbar. – HLGEM

Verwandte Themen