2012-04-03 5 views
1

INSERTトリガーで更新に関するいくつかの記事を見てきました。私の質問は似ていますが、私はと呼ばれ続ける表を特に理解していないので、UPDATEの文で私の構文には注意が必要です。SQL Server INSERTトリガーで初期日付の構文を設定する

トリガーコードは、INSERTの一部の日付列の値のみを更新します(あなたの指導者からここにあるコードのおかげで、'shipdueDate'列を処理するロジックがあります)。

識別子設定に基づいて請求書番号のインクリメントされた値が既に存在するため、新しい行が作成されると、請求書番号が1つ増えます。ただし、オフィスの管理者にとっては簡単です請求書データを追加するために、orderdateshipduedate、およびdateinvoicedフィールドに初期値を設定するとデータ入力が簡単になると考えました。

これは私が事前に

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

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文が明示的に他のいくつかの値にこれらの列を設定しない場合にのみ。

+0

- ありがとう:よう

何か。これは、現在の日付だけが必要なフィールドの良い選択肢です。あなたが言うように、shipduedateは計算であり、私はこれらのデフォルト値をすべて1つの場所に格納しておくことを望んでいます。それにもかかわらず、それは感謝しています。これはいくつかのルールを壊すことはないが、あなたがノバスコシアに住んでいる場合は尋ねたがっていますか?私はそこに生まれたからだけ尋ねる。 –

+0

@CliffRobinson:いいえ、私が3年間そこに勤めた後、Bluenoseの国のちょうど大ファンです。私はスイスで生まれ育った(そして現在は生きています) –

0

挿入された(削除された)ことについて説明しましょう。トリガでは、挿入または削除するデータを含む2つのテーブルを使用できます。更新では、古い値が削除され、新しい値が挿入されます。削除の場合のみ削除されたデータが入力されます。挿入されたもののみが挿入されます。今重要なことは、これに挿入または削除されたレコードを1つしか持たないトリガーに決して頼ることができないことです。あるinsertステートメントに100レコードを挿入した場合、挿入されたレコードは100レコードになります。したがって、レコードが1つしかない場合、コードは正しく動作しません。あなたが挿入された値をスカラ変数に設定しないように注意してください。

あなたのトリガーは、今すぐ更新情報に挿入する必要があります。これは、テーブル内のすべてのレコードを新しい日付で更新するためです。 marc_s @

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

ありがとう。だから理解しようと努力:) - このテーブル '挿入'はどこから来るのですか?それはあなたの本質的に削除と挿入を実行してテーブルのコピーを保持するSQL SVRのメカニズムですか?また、請求書のPKはInvoiceIDです。 inv.idがInvoiceID = i.idであるか、Invoices.InvoiceID = i.InvoiceIDである必要がありますか? –

+0

申し訳ありませんが、上記の質問はあなたに@HLGEM宛てです。 inv.invoiceid = i.invoiceidでコードを追加しようとしましたが、うまくいかないようです。私は試してみる必要がありますか?> inv.invoiceid = i.idにiを挿入しますか?あなたの明確化は大歓迎です。 –

+0

挿入されているテーブルと同じ列名が挿入されています。 Insertedは実際のテーブルではありませんが、トリガーやクエリの出力句でのみ使用できます。 – HLGEM

関連する問題