パソコン情報

【SqlServer】定期的にレコード追加をストアドで実行させる手順

アクセスでレコード追加クエリを作成



まだまだ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の機能で定期スケジュール実行させればいいだけです。