アプリ版:「スタンプのみでお礼する」機能のリリースについて

初心者です。
SQL SERVER 2012です。
「売上明細」テーブルに、新規行を挿入した時に、「得意先単価マスタ」を更新・または追加したい


CREATE
TRIGGER [dbo].[INSTEAD_OF_INSERT_ON_T_D売上明細] ON [dbo].[T_D売上明細]
INSTEAD OF INSERT
<<省略>>
/* 得意先別単価マスタの更新 */

IF (@column_new_value$19 <> 0)
BEGIN
/* 得意先別単価マスタを参照する */
SET @CURSOR_PARAM_CRSTS_CRSTS_得意先コード = @column_new_value$9
SET @CURSOR_PARAM_CRSTS_CRSTS_納品先コード = @column_new_value$10
SET @CURSOR_PARAM_CRSTS_CRSTS_商品コード = @column_new_value$16
DECLARE
crsTS CURSOR LOCAL SCROLL_LOCKS
FOR
SELECT
dbo.T_M得意先別単価.作成日付,
dbo.T_M得意先別単価.更新日付,
dbo.T_M得意先別単価.得意先コード,
dbo.T_M得意先別単価.納品先コード,
dbo.T_M得意先別単価.商品コード,
dbo.T_M得意先別単価.単価区分,
dbo.T_M得意先別単価.売上単価1,
dbo.T_M得意先別単価.売上単価2,
FROM dbo.T_M得意先別単価
WHERE ((dbo.T_M得意先別単価.得意先コード = @CURSOR_PARAM_CRSTS_CRSTS_得意先コード) AND
(dbo.T_M得意先別単価.納品先コード = @CURSOR_PARAM_CRSTS_CRSTS_納品先コード) AND
(dbo.T_M得意先別単価.商品コード = @CURSOR_PARAM_CRSTS_CRSTS_商品コード))
OPEN crsTS

FETCH NEXT FROM crsTS
INTO
@recTS$作成日付,
@recTS$更新日付,
@recTS$得意先コード,
@recTS$納品先コード,
@recTS$商品コード,
@recTS$単価区分,
@recTS$売上単価1,
@recTS$売上単価2

/* 該当が有った場合は更新する */
IF (@@FETCH_STATUS = 0)
IF (@column_new_value$19 = 1)
UPDATE dbo.T_M得意先別単価
SET dbo.T_M得意先別単価.単価区分 = @column_new_value$19, dbo.T_M得意先別単価.売上単価1 = @column_new_value$22
WHERE CURRENT OF crsTS
ELSE
IF (@column_new_value$19 = 2)
UPDATE dbo.T_M得意先別単価
SET dbo.T_M得意先別単価.単価区分 = @column_new_value$19, dbo.T_M得意先別単価.売上単価2 = @column_new_value$22
WHERE CURRENT OF crsTS
ELSE
IF (@column_new_value$19 = 1)
INSERT INTO dbo.T_M得意先別単価
(
dbo.T_M得意先別単価.得意先コード,
dbo.T_M得意先別単価.納品先コード,
dbo.T_M得意先別単価.商品コード,
dbo.T_M得意先別単価.単価区分,
dbo.T_M得意先別単価.売上単価1
)
VALUES
(
@column_new_value$9,
@column_new_value$10,
@column_new_value$16,
@column_new_value$19,
@column_new_value$22
);
ELSE
IF (@column_new_value$19 = 2)
INSERT INTO dbo.T_M得意先別単価
(
dbo.T_M得意先別単価.得意先コード,
dbo.T_M得意先別単価.納品先コード,
dbo.T_M得意先別単価.商品コード,
dbo.T_M得意先別単価.単価区分,
dbo.T_M得意先別単価.売上単価2
)
VALUES
(
@column_new_value$9,
@column_new_value$10,
@column_new_value$16,
@column_new_value$19,
@column_new_value$22
);

CLOSE crsTS

DEALLOCATE crsTS
<<省略>>

上記のように作成してあるのですが、
すでに同一得意先・納品先・商品のマスタが存在する場合は、更新されます。
ですが、存在しない場合、新規に追加したいのですが、そこがうまく動きません。

何が原因でしょうか?

A 回答 (2件)

#1 です。



最初のIF の条件に合った場合の処理と
合わなかった場合の処理を明確に区別しましょう。
それぞれを BEGIN END でくくります。
そしてそれらの間に ELSE を記述します。

つまり、以下のように記述します。

IF (@@FETCH_STATUS = 0)
BEGIN
IF (@column_new_value$19 = 1)
update ・・・
ELSE
IF (@column_new_value$19 = 2)
update ・・・
END

ELSE

BEGIN
IF (@column_new_value$19 = 1)
insert ・・・
ELSE
IF (@column_new_value$19 = 2)
insert ・・・
END

いかがでしょう?

元のソースがどうなっているか判りませんが、
ツールも100% では無いと言うことでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ご教授のあった個所を修正しましたら、動作してくれました。
感謝です。

お礼日時:2012/12/25 09:39

>IF (@@FETCH_STATUS = 0)


これ以降に IF が 4つありますがそれぞれ ELSE IF なのでどれか一つしか
実行されませんよね。

IF (@column_new_value$19 = 1)
update ・・・
ELSE
IF (@column_new_value$19 = 2)
update ・・・
ELSE
IF (@column_new_value$19 = 1)
insert ・・・
ELSE
IF (@column_new_value$19 = 2)
insert ・・・

こんな感じになっていますから 後半の二つの if は前半二つの if と条件が
重複しているので実行されないと思われます。

この回答への補足

回答ありがとうございます。
今回、すでに「T_M得意先別単価」に条件にあった該当データが存在する場合
前半の2つのifにはいり、updateで
存在しない場合、後半のifに入りinsertするよう
作成したつもりなのですが。
その切り分けが
IF (@@FETCH_STATUS = 0)ではないのでしょうか?

すみません。今回もともとoracleで稼働していたものを
sqlserverに切り替えています。
で、今回のトリガーも「SQL Server Migration Assistant for Oracle」というツールを
使いコンバートしたものです。

補足日時:2012/12/21 09:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す