
データベース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の言う事を聞きながら書いていきました。
わかりやすいサイトを見つけました!
分からない事があればネット検索をしますが、本当に記事にしていただいている有志の方には感謝です。
今回も一番参考になったサイトを掲載しておきます。
また、私の記事の場合は自分だけが分かるような自己中の解説にしかなっていませんが、下記のサイトでは見る側の立場になったページになっていると思います。
まだまだストアドで処理させるにはスキルが追い付きませんが、今回の件でも恐怖心が多少緩和したような気がします。