我正在開發一個管理車輛工單的系統。工單的編號組成如下:OT-001-16
。重置SQL Server中存儲過程的ID計數器
凡OT-
是一個字符串,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,然後從該表稱爲idaux
我把ID和我相比,新的可能的ID通過字符串處理。然後,如果所保存的最後一個ID的年份等於當前年份,則計數器將增加,但如果不是,計數器將重新啓動爲001,則在輔助表中更新新ID,並將工作訂單插入表workorder
。
我的存儲過程有效,但我需要您的幫助來優化存儲過程。任何關於評論的問題。
我可以詢問儲存該ID的表格設置嗎?我明白,你想顯示完整的ID爲'OT-001-18'。然而,這樣存儲在桌子上並不方便。我寧願把一年中的一列保存爲一個'int',而在另一列中將今年的計數器保存爲一個'int',然後(可能)創建一個計算列(甚至可能是'persistent'),它會自動創建滿ID。當然,還應該添加對兩列的唯一約束。基於數據庫設置,程序可以更好地優化。 – Ralph