何かと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