2017-12-13 18 views
1

完全なNewbが学習しようとしています。コンマでSQL構文エラー

"OrderDate"が更新/入力されている場合、テーブル "Finance"に "Sales"テーブルが設定されていますが、複数の列を挿入する際に問題があります。

CREATE TRIGGER SalesOrderDateTrigger 
    ON [dbo].[Sales] 
    AFTER INSERT 
    AS 
    BEGIN 
    SET NOCOUNT ON; 

    DECLARE @OrderDate Date 

    SELECT @OrderDate = INSERTED.OrderDate FROM INSERTED 

    IF @OrderDate > 0 
    BEGIN 

    INSERT INTO Finance 
    (Quote, Customer, Project_Name, [Value], 
    POC_Name_#1, POC_Number_#1, POC_Email_#1, 
    POC_Name_#2, POC_Number_#2, POC_Email_#2, 
    Comment, [DA Link]) 
    SELECT (INSERTED.Quote, INSERTED.Customer, INSERTED.Project_Name, 
    INSERTED.[Value], 
    INSERTED.POC_Name_#1, INSERTED.POC_Number_#1, INSERTED.POC_Email_#1, 
    INSERTED.POC_Name_#2, INSERTED.POC_Number_#2, INSERTED.POC_Email_#2, 
    INSERTED.Comment, INSERTED.[DA Link]) 
    FROM INSERTED 

    END 


END 

ありがとうございます。あなたのアプローチにはいくつかの問題がある

+1

のオフに基づいてVIEW可能性が? ??????????????それは質問をするときに最も重要な情報です。 – Eric

+0

あなたは 'SELECT'に()を必要としません。 – indiri

+0

SELECT @OrderDate = min(OrderDate)FROMを挿入したかったのですが、「WHERE OrderDate> 0」を「SELECT x、y、z」に追加する必要があります。 'INSERT'自体です。 – shawnt00

答えて

0

..

あなたはいつも道の「ブロックデータの」種類でこれを見ていません。もちろん、一度に1行しか挿入することはできませんが、同時に複数の行を同時にテーブルに挿入することは可能です。これが発生すると、inserted疑似対象は複数の行を持つことになるので、単一の受注日を1つの変数@orderdateに選択することはできません。 sqlserverトリガーを使用して「行ごとに」考えるのは避けてください。 sqlserverサーバー側プログラミングの設計意図は、それが常にベースに設定されていることです。あなたがトリガーで書いたものは一度に0から何百万行もの行をすべて一度に処理する必要があります。

私は0と日付を比較する行が実際には達成しようとしていません

その後、Orderテーブルにあるデータを効果的にFinanceテーブルに挿入する挿入を実行します。新規または異なるデータが計算されたり、他の場所から持ち込まれたりすることはありません。これは、注文と資金が同じデータを持つ多数の列を共有していると考えています。データベース設計の面では、これは正規化戦略が貧弱です。 financeテーブルがordersテーブルを複製する場合は、存在しないはずです。あなたのビジネスロジックがある場合は実際にnull以外の受注日とOrdersテーブルのエントリは、金融テーブルのエントリを実現することを、本当にファイナンスは実際には、DBMS単純なクエリ

SELECT blahblah FROM orders WHERE orderdate IS NOT NULL 
+0

別の意見が...あなたは目を覚ましてハンマーで私を殴った。最高のビット私は実際にそれを書く方法を知っています。 Tbh私はあなたのような誰かがやって来ることを期待していました。 – NewbieMcNewbface