何かとSqlServerのストアドの使い方も怪しいし、コードも初心者なのでおぼつか無い状況が続いています。
今回も
今回の課題
2つのテーブルを比較して、同じレコードが無ければ追加する
というストアドプロシージャを作成したので備忘録にしておこうと思います。
オブジェクト名が無効です!(解決)
MSSMSでストアドを作成していると、赤い波線がエラーを教えてくれます。
過去にも何度もありましたが、下記の対応をすれば改善します。
理解はしていませんが、解決策を備忘録にしておきます。
解決は下記の作業をするだけです。
ココに注意
コードが間違っているわけではないというのが嫌らしい
ところです。
ショートカットキーで、「Ctrl+Shuft+R」と言う方が簡単でいいですね。
でも、覚えてないよ!!
SELECT の値の数は、INSERT 列の数と一致(解決)
2つのテーブルを比較して、無ければ追加というコードを下記のようにしましたが、
エラーメッセージ
NSERT ステートメントの SELECT リストは INSERT リストよりも項目数が多くなっています。
SELECT の値の数は、INSERT 列の数と一致させてください
となって意味が分かりません。
/****** テーブル比較して更新なければ追加 ******/ INSERT INTO cusdata1 ( client_id, customer_phone, customer_name, customer_postalcode, customer_address1, customer_address2, customer_address3, customer_email ) SELECT client_id /ここのカンマが抜けていた/ customer_phone, customer_name, customer_postalcode, customer_address1, customer_address2, customer_address3, customer_email FROM cusdata1_comp WHERE cusdata1_comp.customer_phone <> customer_phone
結局原因は、カンマが抜けていただけでした。カンマ抜けとか、コロンにしていたとかで、この警告メッセージがでるようです。
ただ、上のコードでは、2つのテーブルを比較してレコード追加はできませんでした。
追及する時間が無かったので下記のコードで解決してしまいました。
成功したストアドコード
cusdata1というのが、追加対象テーブルです。
cusdata1_compというのが、比較するテーブルです。
cusdata1_compのテーブル内容と、cusdata1のcustomer_phoneで無い場合(cusdata1テーブルに無い場合)にcusdata1に追加するというコードです。
今一つ、カッコが必要だったり、必要なかったりの区別が良くわかりませんが、今回はこの内容でちゃんと動きました。
USE [Logistics] GO /****** Object: StoredProcedure [dbo].[customer_add] Script Date: 2020/07/23 14:53:49 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[customer_add] AS BEGIN TRY BEGIN TRANSACTION /****** テーブル比較して無ければ追加 ******/ MERGE INTO cusdata1 USING ( SELECT client_id, customer_phone, customer_name, customer_postalcode, customer_address1, customer_address2, customer_address3, customer_email FROM [dbo].[cusdata1_comp] )cusdata1_comp ON ( [dbo].[cusdata1].customer_phone = cusdata1_comp.customer_phone ) WHEN NOT MATCHED THEN INSERT ( client_id, customer_phone, customer_name, customer_postalcode, customer_address1, customer_address2, customer_address3, customer_email ) VALUES ( cusdata1_comp.client_id, cusdata1_comp.customer_phone, cusdata1_comp.customer_name, cusdata1_comp.customer_postalcode, cusdata1_comp.customer_address1, cusdata1_comp.customer_address2, cusdata1_comp.customer_address3, cusdata1_comp.customer_email ); COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION RETURN ERROR_NUMBER() END CATCH RETURN 0