私は車両の作業指示を管理するシステムを開発しています。作業指示書のIDは、OT-001-16
となります。 OT-
が文字列であるSQL ServerのストアドプロシージャのIDカウンタをリセットします
、001
は-
文字が続く、カウンタで、最終的には数16
は現在の年です。
例:
現在の年が2018年である場合、IDはOT-001-18
でなければなりません。
年が変更されると、カウンタが001
から再開する必要があります。私はそれを行うストアドプロシージャを持っていますが、私はもっと多くの作業をしていると思います。
これは私のストアドプロシージャのコードです:
CREATE PROCEDURE ot (@name varchar(100), @area varchar(100), @idate varchar(100), @edate varchar(100))
AS
BEGIN
SET NOCOUNT ON;
DECLARE @aux varchar(100);
DECLARE @aux2 varchar(100);
DECLARE @aux3 int;
DECLARE @aux4 varchar(100);
SELECT @aux = id_workorder FROM idaux;
IF (@aux IS NULL)
SET @aux = CONCAT('OT-000-', RIGHT(YEAR(GETDATE()), 2));
SET
@aux2 = SUBSTRING(
@aux, CHARINDEX('-', @aux) + 1,
LEN(@aux) - CHARINDEX('-', @aux) - CHARINDEX('-', REVERSE(@aux)));
SET @aux3 = CAST(@aux2 AS int) + 1;
SET @aux4 = @aux3;
IF @aux3 < 1000
IF @aux3 >= 10
SET @aux4 = CONCAT('0', @aux4);
ELSE
SET @aux4 = CONCAT('00', @aux4);
ELSE
SET @aux4 = @aux4;
DECLARE @f varchar(100);
DECLARE @y varchar(50);
SELECT TOP 1
@y = id_workorder
FROM workorder
WHERE (RIGHT(id_workorder, 2)) = (RIGHT(YEAR(GETDATE()), 2))
ORDER BY id_workorder DESC;
DECLARE @yy varchar(10);
SET
@yy = RIGHT(@y, 2);
DECLARE @yn varchar(10);
SET
@yn = RIGHT(YEAR(GETDATE()), 2);
BEGIN
IF @yn = @yy
BEGIN
DECLARE @laux varchar(20)
SET @f = 'OT-' + @aux4 + '-' + RIGHT(YEAR(GETDATE()), 2);
INSERT INTO workorder (id_workorder, name, area, initial_date, end_date)
VALUES (@f, @name, @area, @idate, @edate);
SELECT
@laux = id_workorder
FROM idaux
IF (@laux IS NULL)
BEGIN
INSERT idaux (id_workorder) VALUES (@f);
END
ELSE
BEGIN
UPDATE idaux SET id_workorder = @f;
END
END
ELSE
BEGIN
SET @f = CONCAT('OT-001-', (RIGHT(YEAR(GETDATE()), 2)));
INSERT INTO workorder (id_workorder, name, area, initial_date, end_date)
VALUES (@f, @name, @area, @idate, @edate);
SELECT @laux = id_workorder FROM idaux;
IF (@laux IS NULL)
BEGIN
INSERT idaux (id_workorder) VALUES (@f);
END
ELSE
BEGIN
UPDATE idaux SET id_workorder = @f;
END
END
END
END
は基本的に、私は最後の作業の順序IDを保存するためにAUXILIARテーブルを作成し、その後、この表から、私はIDを取得し、私は新しい可能なIDと比較idaux
と呼ばれます文字列処理によって。次に、保存された最後のIDの年が現在の年と等しい場合、カウンタは増加しますが、カウンタが001に再起動されない場合、新しいIDが補助テーブルで更新され、作業オーダーがテーブルworkorder
に挿入されます。
私のストアドプロシージャは動作しますが、私はストアドプロシージャを最適化するためにあなたの助けが必要です。コメントに投稿された質問。
このIDが格納されているテーブルの設定についてお問い合わせできますか?完全なIDを 'OT-001-18'として表示したいと思います。しかし、このようにテーブルに格納するのは便利ではありません。私はむしろ1つの列を 'int'として保存し、もう1つの列に今年の' int'としてカウンタを保存し、計算された列(おそらくは 'persistent')を作成して自動的にフルを作成しますID。もちろん、2つの列に対するユニークな制約も追加する必要があります。 DB設定に基づいて、プロシージャをより最適化することができます。 – Ralph