Server

【SqlServer】別データベースのテーブルを比較してレコード無ければ追加、あれば更新処理をするストアド

データベースAccessからの、SqlServerへと自分のレベルには禁断の地に踏み入れてしまい日々迷路に迷っている状況です。

今回は、

ポイント

データベースの違うテーブルを比較して、同じレコードが無ければ追加して、存在する場合は更新するという課題です。

Accessでクエリなどを使ってやれば簡単にできるような事かもしれませんが、意外とSqlServerのデータベースが違うテーブルを使おうとするとODBC接続関係で難しい壁にぶち当たってしまいます。

 

 

 

AccessでVBA処理をさせようとしたら壁

 

端末側をアクセス(Access)を使ってシステムを作成していますが、データベースが違ったテーブルを使おうとすると意外と難しい壁に当たります。

今回も、テーブル構成は同じで、データベースが違うテーブルを比較して、比較テーブルのレコードが、元テーブルに存在しない場合は、追加処理をして、存在するときは更新処理をするという処理をさせたかったわけなのですが、VBAやSOLで組もうとすると、ODBC接続で失敗しました。

権限関係をどうかすれば問題解決するようですが、色々と試して見ましたが時間ばかりが過ぎていくので断念しました。

 

そして、

やっぱり行きつく先は、Sqlserver上で処理させられるストアド

になります。

私のレベルでは難しすぎるのですが、やるしかありません。

 

 

テーブル構成

 

Access上でのリンクテーブルで見ていますが、Sqlserver上でテーブルを作成しました。

 

 

ストアドプロシージャのコード

USE [Logistics]
GO
/****** Object:  StoredProcedure [dbo].[client_calc]    Script Date: 2020/06/13 11:41:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[client_calc]
AS
BEGIN TRY
    BEGIN TRANSACTION

/****** テーブル比較して存在すれば更新なければ追加 ******/ 
MERGE INTO Logistics_master.[dbo].[total_master_client]
USING (
  SELECT
    ID,
    shop_name,
    client_name,
    contact_name,
    contact_name_kana,
    postal_code,
    adress1,
    adress2,
    adress3,
    tel,
    fax,
    e_mail,
    remarks
  FROM
    [dbo].[transfer_client]
)transfer_client
ON (
  Logistics_master.[dbo].[total_master_client].ID = transfer_client.ID
)
WHEN MATCHED THEN
  UPDATE SET
    Logistics_master.[dbo].[total_master_client].shop_name = transfer_client.shop_name,
    Logistics_master.[dbo].[total_master_client].client_name = transfer_client.client_name,
    Logistics_master.[dbo].[total_master_client].contact_name = transfer_client.contact_name,
    Logistics_master.[dbo].[total_master_client].contact_name_kana = transfer_client.contact_name_kana,
    Logistics_master.[dbo].[total_master_client].postal_code = transfer_client.postal_code,
    Logistics_master.[dbo].[total_master_client].adress1 = transfer_client.adress1,
    Logistics_master.[dbo].[total_master_client].adress2 = transfer_client.adress2,
    Logistics_master.[dbo].[total_master_client].adress3 = transfer_client.adress3,
    Logistics_master.[dbo].[total_master_client].tel = transfer_client.tel,
    Logistics_master.[dbo].[total_master_client].fax = transfer_client.fax,
    Logistics_master.[dbo].[total_master_client].e_mail = transfer_client.e_mail,
    Logistics_master.[dbo].[total_master_client].remarks = transfer_client.remarks
WHEN NOT MATCHED THEN
    INSERT
    (
    ID,
    shop_name,
    client_name,
    contact_name,
    contact_name_kana,
    postal_code,
    adress1,
    adress2,
    adress3,
    tel,
    fax,
    e_mail,
    remarks
    )
    VALUES
    (
    transfer_client.ID,
    transfer_client.shop_name,
    transfer_client.client_name,
    transfer_client.contact_name,
    transfer_client.contact_name_kana,
    transfer_client.postal_code,
    transfer_client.adress1,
    transfer_client.adress2,
    transfer_client.adress3,
    transfer_client.tel,
    transfer_client.fax,
    transfer_client.e_mail,
    transfer_client.remarks
    );


 
    COMMIT TRANSACTION
 
END TRY
 
BEGIN CATCH
    ROLLBACK TRANSACTION
 
    RETURN ERROR_NUMBER()
 
END CATCH
 
RETURN 0

 

データベースが違うと、

Logistics_master.[dbo].[total_master_client].shop_name

 

のように、

ココがポイント

[データベース].[dbo].[テーブル名].列名

のようになるようですが、全ての場所に同じようにやればいいという事ではなく、MSSMSのエラーを見ながら最終的に動いたコードが上の物になります。

ポイント

私のレベルでは、この法則性が良くわかってないので、MSSMSの言う事を聞きながら書いていきました。

 

 

 

わかりやすいサイトを見つけました!

 

分からない事があればネット検索をしますが、本当に記事にしていただいている有志の方には感謝です。

今回も一番参考になったサイトを掲載しておきます。

また、私の記事の場合は自分だけが分かるような自己中の解説にしかなっていませんが、下記のサイトでは見る側の立場になったページになっていると思います。

 

まだまだストアドで処理させるにはスキルが追い付きませんが、今回の件でも恐怖心が多少緩和したような気がします。

 

 

 



 

-Server
-, , , , , ,

© 2020 PCTips