まだまだSqlServerのストアドを使おうとすると身構えてしまう自分です。
今回は、
ココがポイント
定期的にレコード追加のストアドを動かして別テーブルに日々のバックアップ
を取ろうとした備忘録です。
まずはSqlServerでストアドのコードをAccessで作成
自分には直接SQLのコードを書く自信がないので、Accessでレコード追加クエリを作成してSQLビューに変換してストアドのSQLとして使います。
INSERT INTO dbo_stock_log ( day_log, product_code, jan_sku_code, stock_log )
SELECT Date() AS [day], dbo_stock.[product_code], dbo_stock.[jan_sku_code], dbo_stock.[stock]
FROM dbo_stock;
MSSMSにてストアド作成
https://pctips.jp/pc-soft/sqlserver-access-stored-procedure202002/
まずは、空のストアドを作成します。
CREATE PROCEDURE [dbo].[stock_addlog] AS BEGIN PRINT 'ここに処理を記述'; END;
次に、プログラミング>>ストアドプロシージャから、作成したストアドを選択して、「変更」にて編集モードに移動します。
Accessで作成したSQLコードを何も考えずに、ストアドに突っ込みます。
赤い下線が出現していますが、このままですとエラーになります。
赤い下線の上にマウスポインタを持っていくと「オブジェクト名が無効です」とでます。
ココに注意
SqlServerのストアド用にSQLを修正が必要
です。
ちなみに、ストアドを仮に動かしてみるには下記のコードを書いて実行すれば動きます。
EXEC stock_addlog;
現状では、もちろんエラーになりますので、SQLコードの修正をします。
【追記】修正したのに赤の下線が消えない時(下記の外部サイト参考)
ストアド様にSQLコードの修正
いちいち説明するよりもコードを見てもらった方が早いとおもいますので、下記に修正後のSQLコードを載せておきます。
INSERT INTO stock_log ( day_log, product_code, jan_sku_code, stock_log ) SELECT GETDATE() AS [day], stock.[product_code], stock.[jan_sku_code], stock.[stock] FROM stock
dboが必要なかったり、必要だったりしますが、その辺を注意して修正すればOKなので簡単です。
じつは一番悩んだのが、日付関数でした。
Accessなら、Date()でいいのですが、
ココがポイント
ストアドの場合は、GETDATE()
になるようです。
修正した下記のコードを実行したらしっかりとレコード追加されておりました。
USE [Logistics] GO /****** Object: StoredProcedure [dbo].[stock_addlog] Script Date: 2020/07/14 12:46:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[stock_addlog] AS BEGIN TRY BEGIN TRANSACTION INSERT INTO stock_log ( day_log, product_code, jan_sku_code, stock_log ) SELECT GETDATE() AS [day], stock.[product_code], stock.[jan_sku_code], stock.[stock] FROM stock COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION RETURN ERROR_NUMBER() END CATCH RETURN 0
次に定期的にこのストアドを実行させる項目に行きたいと思います。
Expressは、エージェントは含まれない制限
SqlServerエージェントは定期的にストアドなどを実行させることができるツールのようです。
無料のExpress版だと、エージェントが入っていませんので、Windowsのスケジュール実行のバッチファイルからストアドを動かすしか方法が無いようです。
ストアドを動かすバッチファイルは下記のようにしました。
sqlcmd -S インスタンス名 -d データベース名 -Q "EXEC [dbo].[stock_addlog];" -o stock.log
サーバー上から実行するので、ユーザー名とパスワードはいらないようですね。
stock_log.batというバッチファイル名にして、仮に実行してみました。
ちゃんとストアドが実行されてレコードの追加がされていました。
あとは、Windowsの機能で定期スケジュール実行させればいいだけです。