2016-06-29 4 views
0

監査の目的でSQL Server 2008 R2にトリガーを作成しようとしています。国の異なる場所の適切なタイムゾーンを取得するには、DATEADD()関数を使用して時間を変更するIF/ELSE IFステートメントに変数を渡そうとしています。ここに私のコードはあります:会話エラーを予期しているSQL Server

CREATE TRIGGER epic_cover_insert 
ON epic_cover 
AFTER INSERT 
AS 
BEGIN 
DECLARE @facilityCode INT 

SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover) 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for trigger here 
UPDATE epic_cover 
IF @facilityCode = 403 --for logan 
    BEGIN 
     SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
      Created_On = DATEADD(HH,-1,GETDATE() 
    END 
    ELSE IF @facilityCode = 203 -- for Thermont 
     BEGIN 
      SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
       Created_On = DATEADD(HH,1,GETDATE()) 
     END 
    ELSE IF @facilityCode = 263 --for Saint Charles 
     BEGIN 
      SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
       Created_On = GETDATE() 
     END 
END 
END 

私は、すべてが予期した会話と言っているすべての種類のエラーを受けています。私はこれが何を意味するのか分かりません。私はそれをgoogledし、ちょうど混乱に追加されました。

+0

取得したエラーは何ですか?また、クエリのどの部分ですか? –

+0

IFとELSE IFステートメントのすべてが私にEXP CONTING CONVERSATIONエラーを与えています。 – bryanfm92

答えて

0

最初にトリガーを書くときは、一度に複数のレコードが挿入、更新、または削除されると考える必要があります。

私はSQL Serverがあなたのコードを見ていると仮定していますが、別のrdbmsに注意してください。

SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover) 

はいつもあなたが望むものではないとするepic_coverにすでに存在するファシリティコードを提供するつもりです。

次に、許可されていない更新文をIF文と混在させようとしています。しかし現実には、あなたは何もしていないし、あなたは単にケースステートメントを使用することができます。

次に、挿入されたものだけでなく、テーブルのすべてのレコードを更新します。追加されたレコードを把握する方法がない場合は、テーブルにプライマリキーが必要です。次に特別な"inserted"テーブルを使用します。

CREATE TRIGGER epic_cover_insert 
ON epic_cover 
AFTER INSERT 
AS 
BEGIN 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for trigger here 
UPDATE epic_cover 
    SET Created_By = CASE WHEN i.Created_By IS NULL THEN SUSER_NAME() 
        WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
        ELSE i.Created_By END 
     ,Created_On = CASE 
     -- right function is for strings so I assume order num is a string if not you will need to do some casting 
      WHEN RIGHT(i.order_num, 3) = '403' THEN DATEADD(HH,-1,GETDATE()) 
      WHEN RIGHT(i.order_num, 3) = '203' THEN DATEADD(HH,1,GETDATE()) 
      WHEN RIGHT(i.order_num, 3) = '263' THEN GETDATE() 
      ELSE NULL-- ????? 
     END 
FROM 
    epic_cover e 
    INNER JOIN inserted i 
    ON e.PrimaryKey = i.PrimaryKey 

END 
+0

これははるかに理にかなっています。私は完全に挿入テーブルの使用を忘れてしまった。ありがとうございました – bryanfm92

+0

それは喜んで喜んで、トリガーは、世界の中で最も簡単なことではないの論理を考える!そして、それらにパフォーマンスの影響があります....とにかく、私はあなたがそれを必要としないので、私のコードから変数を更新して削除しました。それがあなたのために働くなら、答えを受け入れてください。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work thanks – Matt

+0

あなたの答えを受け入れました。今日は私を助けただけでなく、たくさんのことを教えてくれました。十分にあなたに感謝することはできません。 – bryanfm92

関連する問題