初心者です。
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
<<省略>>
上記のように作成してあるのですが、
すでに同一得意先・納品先・商品のマスタが存在する場合は、更新されます。
ですが、存在しない場合、新規に追加したいのですが、そこがうまく動きません。
何が原因でしょうか?
No.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% では無いと言うことでしょう。
No.1
- 回答日時:
>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」というツールを
使いコンバートしたものです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセル VBA 難しいです 1 2023/02/21 15:39
- Excel(エクセル) IFERROR、SMALL関数について 2 2022/08/22 23:40
- Excel(エクセル) Excel関数 情報引用する方法 4 2022/07/31 20:59
- 不動産投資・投資信託 投資信託で取得単価が下がるのはなぜ? 1 2022/11/30 14:16
- その他(資産運用・投資) 株式の平均取得単価について 4 2022/11/17 01:36
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- 債券・証券 先月から積み立てニーサを始めましたが、数量やら単価やら取得価格やらの意味がいまいちよく理解できません 1 2022/12/17 10:50
- Excel(エクセル) 単価シートから単価をエクセル関数で自動取得する方法 1 2023/07/02 22:00
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
SQLのエラー(~付近に不適切な...
-
ACCESS2007 フォーム 「バリア...
-
SQL Date型の列から年月だけを...
-
SQLサーバー接続 特定のPCがWin...
-
Access2021 レコードロックにつ...
-
sqlserverで集計結果をUPDATEし...
-
Accessの重複なしのカウントの...
-
SQLCMDにて教えていただきたい...
-
SQLについて
-
[SQLServer] テーブル名からカ...
-
SQLのクエリの書き方
-
【VB.NET】日付型の列にNULLを...
-
BULK INSERT時のNull許容について
-
AccessのInsertクエリのあとつ...
-
SQL文 複数実行
-
sqlserverで同一キー単位で金額...
-
SQL ExpressエディションのCPU...
-
SQL ServerでDBを構築。これは...
-
データベースのメタ値はどこに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL Date型の列から年月だけを...
-
ACCESS2007 フォーム 「バリア...
-
SQLサーバー接続 特定のPCがWin...
-
Accessの重複なしのカウントの...
-
SQLのエラー(~付近に不適切な...
-
sqlserverで集計結果をUPDATEし...
-
サーバー破壊
-
<SQL>重複しているデータの場合...
-
SQLサーバで和暦から西暦に変換...
-
【VB.NET】日付型の列にNULLを...
-
sqlで、600行あるテーブルを100...
-
【SQLサーバ】float型における...
-
SQL文 複数実行
-
Visuaal Studio Community 2022...
-
BULK INSERT時のNull許容について
-
ACCESSで3ファイルを結合して、...
-
chr(13) と char(13) の違いっ...
-
[SQLServer] テーブル名からカ...
-
SQLCMDにて教えていただきたい...
-
Access2021 「ISNULL関数には引...
おすすめ情報