
初心者です。
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLのエラー(~付近に不適切な...
-
ACCESS2007 フォーム 「バリア...
-
sqlserverで集計結果をUPDATEし...
-
SQL文 複数実行
-
SQLCMDにて教えていただきたい...
-
<SQL>重複しているデータの場合...
-
chr(13) と char(13) の違いっ...
-
SQL ExpressエディションのCPU...
-
Microsoft SQL Serverについて
-
Visuaal Studio Community 2022...
-
2つのSQL(Access)の結果[時刻,...
-
SQLサーバで和暦から西暦に変換...
-
sqlserverでUPDATEできません
-
BULK INSERT時のNull許容について
-
トランザクション
-
インストール可能なISAMド...
-
Wacom Cintiq 16 と Wacom Cint...
-
SQLをはじめから勉強するには
-
SQL クエリ データ数
-
SQL Server management studio ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLのエラー(~付近に不適切な...
-
ACCESS2007 フォーム 「バリア...
-
SQL Date型の列から年月だけを...
-
Accessの重複なしのカウントの...
-
BULK INSERT時のNull許容について
-
sqlserverで集計結果をUPDATEし...
-
SQLサーバー接続 特定のPCがWin...
-
【VB.NET】日付型の列にNULLを...
-
sqlで、600行あるテーブルを100...
-
<SQL>重複しているデータの場合...
-
ACCESSで複数テーブルを結合し...
-
SQLサーバで和暦から西暦に変換...
-
SQL文 複数実行
-
SQLCMDにて教えていただきたい...
-
SQLをはじめから勉強するには
-
【SQLサーバ】float型における...
-
Visuaal Studio Community 2022...
-
[SQLServer] テーブル名からカ...
-
Access2021 「ISNULL関数には引...
-
ACCESSで表が作りたく、そのた...
おすすめ情報