intra-martのスクリプト開発時にSQLと同時に結果を取得する[SQLServer]

2020年05月24日 00時05分

intra-mart のスクリプト開発時には2waySQL(sql ファイルを指定しての実行)実装ができる。

ただ、intra-mart は並列して複数のSQL文を実行することはできず、別ファイルで定義する必要がある。(返却値が1つのSQL文の結果DBResultという形式を取るため)

ISNERT後のIDを取得する場合、INSERTとSELECTの2回の処理が必要になる。

ただ、INSERT・UPDATE時にSELECT 文ではなくOUTPUT句を使用して書くと、更新前データ・更新後データが取得することができる。

これはintra-martの2waySQLでも許容されている書き方だった。

INSERT文

INSERT Employee(id, name)
    OUTPUT INSERTED.id  --ここでIDを取得する
VALUES (1, 'taro');

UPDATE文

UPDATE Employee
SET id = /*newId:number*/0
OUTPUT 
    INSERTED.id  --更新後IDを取得する
    DELETED.id   --更新前IDを取得する
WHERE id = /*oldId:number*/

DELETE文

-- DELETE時
DELETE FROM Employee
    OUTPUT DELETED.id  --ここでIDを取得する
WHERE id = /*deleteId:number*/

ただし、OUTPUT 句は

INSERTED 挿入操作または更新操作で追加される値を指定する列プレフィックスです。 INSERTED プレフィックスの付いた列は、UPDATE、INSERT、または MERGE ステートメントが完了した後の、トリガーが実行される前の値を反映します。

OUTPUT 句 (Transact-SQL)

とあるように、予想値なのでほぼ同じ時間に複数のインサートが予想される場合やコミットさせるまで処理が長い場合は使わない方が良いですね。