パソコン情報

【SqlServer】2つのテーブルを比較して無ければレコード追加するストアドプロシージャ

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