質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

2255閲覧

SQLのMerge文の実行結果(INSERT,UPDATE)のどちらを行ったのか取得する方法について

seesaajira-

総合スコア107

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

1グッド

0クリップ

投稿2023/07/25 01:24

実現したいこと

クエリの実行結果(INSERT,UPDATE)のどちらを行ったのか取得して、
INSERTを行った場合は別の処理を走らせたい。

MERGE文がどちらの処理を行ったか戻り値を取得する方法を教えて頂けないでしょうか?

前提

  • VB.netを使用しています
  • SQL SERVER 2019を使用しています
  • テーブルのレコードが存在すればUPDATE
  • テーブルにレコードが存在しなければINSERT
  • MERGEの戻り値を取得して別の処理を走らせる

該当のソースコード

Dim Query As String = String.Empty Dim DBfactry As DbProviderFactory = DbProviderFactories.GetFactory(My.Settings.データプロバイダ名) Dim DBtrn As DbTransaction Dim cn As DbConnection = DBfactry.CreateConnection cn.ConnectionString = My.Settings.データ接続文字 Dim DBcmd As DbCommand = cn.CreateCommand DBcmd.Connection = cn '接続 cn.Open() DBtrn = cn.BeginTransaction Try DBcmd.Transaction = DBtrn For i = 0 To DataGridView.Rows.Count - 2 Query = "With InsertData as (" Query += " SELECT @年月 年月,@行No 行No,@商品コード 商品コード,@商品名 商品名,@規格 規格,@産地コード 産地コード,@荷姿コード 荷姿コード,@入数 入数,@数量 数量,@単価 単価,@金額 金額,@担当者コード 担当者コード" Query += " )" Query += " MERGE Table_A AS TargetData " Query += " Using InsertData" Query += " ON TargetData.Tana_nentuki = InsertData.年月 AND TargetData.Item_CD = InsertData.商品コード AND TargetData.Item_Name = InsertData.商品名" Query += " AND TargetData.Standard = InsertData.規格 AND TargetData.Producing_area_CD = InsertData.産地コード AND TargetData.Unit_CD = InsertData.荷姿コード AND TargetData.In_Quantity = InsertData.入数" Query += " WHEN MATCHED " Query += " THEN UPDATE SET Quantity=@数量,Unit_Price=@単価,Price=@金額" Query += " WHEN NOT MATCHED BY TARGET " Query += " THEN INSERT (Tana_nentuki,Line_No,Item_CD,Item_Name,Standard,Producing_area_CD,Unit_CD,In_Quantity,Quantity,Unit_Price,Price,employeecd)" Query += " VALUES (InsertData.年月,InsertData.行No, InsertData.商品コード, InsertData.商品名, InsertData.規格, InsertData.産地コード, InsertData.荷姿コード, InsertData.入数, InsertData.数量, InsertData.単価, InsertData.金額, InsertData.担当者コード)" Query += " OUTPUT $action AS RESULT_STRING; " DBcmd.Parameters.Clear() DBcmd.Parameters.Add(New SqlParameter("@年月", gdt_売上日.Text)) DBcmd.Parameters.Add(New SqlParameter("@行No", i)) DBcmd.Parameters.Add(New SqlParameter("@商品コード", DataGridView(clm_商品コード.Index, i).Value)) DBcmd.Parameters.Add(New SqlParameter("@商品名", DataGridView(clm_商品名.Index, i).Value)) DBcmd.Parameters.Add(New SqlParameter("@規格", DataGridView(clm_規格.Index, i).Value)) DBcmd.Parameters.Add(New SqlParameter("@産地コード", DataGridView(clm_産地コード.Index, i).Value)) DBcmd.Parameters.Add(New SqlParameter("@荷姿コード", DataGridView(clm_荷姿コード.Index, i).Value)) DBcmd.Parameters.Add(New SqlParameter("@入数", DataGridView(clm_入数.Index, i).Value)) DBcmd.Parameters.Add(New SqlParameter("@数量", DataGridView(clm_数量.Index, i).Value)) DBcmd.Parameters.Add(New SqlParameter("@単価", DataGridView(clm_単価.Index, i).Value)) DBcmd.Parameters.Add(New SqlParameter("@金額", DataGridView(clm_金額.Index, i).Value)) 'コマンドの実行 DBcmd.CommandText = Query DBcmd.ExecuteNonQuery() If DBcmd.ExecuteScalar().ToString().IndexOf("INSERT") >= 0 Then '別の処理を走らせる End If Next

試したこと

以下のロジックで戻り値を取得できるかと期待したのですが、"UPDATE"しか返ってきません。

If DBcmd.ExecuteScalar().ToString().IndexOf("INSERT") > 0 Then '別の処理を走らせる End If

よろしくお願いいたします。

maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2023/07/25 02:30

DBcmd.ExecuteNonQuery() で実行しているからでは?
guest

回答1

0

ベストアンサー

VB.NET

1 'コマンドの実行 2 DBcmd.CommandText = Query 3 DBcmd.ExecuteNonQuery() ' ① 4 5 If DBcmd.ExecuteScalar().ToString().IndexOf("INSERT") >= 0 Then ' ② 6 '別の処理を走らせる 7 End If

①でINSERT、②では①でINSERTされてデータがあるからUPDATEになるのではないですか?

投稿2023/07/25 02:39

YAmaGNZ

総合スコア10544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seesaajira-

2023/07/25 03:06

DBcmd.ExecuteNonQuery() の行を削除したら、難なく動きだしました。 助かりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問