2016-11-14 22 views
0

次の列を持つ表があり、スキーマを変更できません。つまり、表を変更したり、IDフィールドを追加することはできません。挿入後のトリガー

私が望むのは、ある列を更新してIDフィールドとして扱うトリガーを作成することです。

accountno  firstname lastname  keyField 
jku45555  John   Doe   123 

は今、私が欲しいもの、私は次のレコードを挿入するとき、私は(心の中でこのVarcharフィールドを維持する)前のレコードのKeyFieldIdを取得し、124であることを新たに挿入されたレコードを更新しています。

私はこれを行うための最良の方法が必要です。私はテーブルを変更することはオプションではないと言いました。ありがとう!

+0

に行番号を追加することによって、実際のINSERTを実行し、行番号

  • ためCTEに列を追加します。 ? –

  • +1

    私はあなたが言っていることを正確に知っていますが、これは私が過去にこれをしなかったAPIですが、今は新しいバージョンにアップグレードしており、カスタマイズされたフィールドはすべて削除されます。私がすでにカスタマイズしたIDフィールドからこのフィールドにデータを移動したので、私が言及した1つのフィールドを使用するだけで、必要なのはそのフィールドを更新することだけです。 PmbAustinは実際にはまっすぐな例を示しています。しかし、私の手は縛られている。 –

    答えて

    2

    次の2つの列、ファーストネームとKeyFieldId(両方varchar型)で、このトリガーは、あなたがやりたいだろう、「foo」という名前のテーブルのために...このような何かをしたい:

    ------------------------------------------------------------------------- 
    -- These lines will create a test table and test data 
    --DEBUG: CREATE TABLE Foo (FirstName varchar(20), KeyFieldId varchar(10)) 
    --DEBUG: INSERT INTO Foo VALUES ('MyName', '145') 
    --  
    CREATE TRIGGER test_Trigger ON Foo 
    INSTEAD OF INSERT 
    AS 
    BEGIN 
        DECLARE @maxKeyFieldId int; 
        SELECT @maxKeyFieldId = MAX(CAST(KeyFieldId AS int)) FROM Foo; 
        WITH RowsToInsert AS (
         SELECT *, ROW_NUMBER() OVER (ORDER BY (CAST(KeyFieldId AS int))) AS RowNum 
         FROM inserted 
        ) INSERT INTO Foo (FirstName, KeyFieldId) 
         SELECT FirstName, @maxKeyFieldId + RowNum 
          FROM RowsToInsert; 
    
    END 
    

    ここで注意すべき事柄:

    1. あなたKeyFieldID
    2. のINTEGER値の「最大」値はすべてFを選択CTEを作成して下さいINSTEAD INSERTトリガーの
    3. を作成します。あなたがいない好奇心のうち、ID列を追加することができますなぜROM「挿入」コレクション
    4. は最大KeyFieldID
    +0

    ありがとう、ちょうど私を正しい軌道に乗せていただきありがとうございます。レコードがCRMから挿入されてから更新する必要はありません。今はKEYFIELDをmaxkeyfieldid + RowNumに更新するだけです。 –

    +0

    INSTEAD OF INSERTトリガーが実行されます*代わりに*挿入するので、コードは挿入を行う必要があります。挿入後にINSERTを実行すると、更新が行われますが、この場合挿入をやり直してすぐに更新を行う必要はありません。開始するには正しいデータを挿入してください。 – pmbAustin

    関連する問題