2015-12-24 57 views
1

我想創建自動的代碼示例:創建自動代碼

B001, B002, B003, B004 .....

我有創造的功能:

CREATE FUNCTION AUTO_CODE() 
RETURNS CHAR (4) 
AS 
BEGIN 
    DECLARE @KODE CHAR(4) 
    SELECT @KODE = COUNT (KODE_BARANG)FROM BARANG 
    IF @KODE>0 
    BEGIN 
     SELECT @KODE = RIGHT(KODE_BARANG,4) FROM BARANG 
     SET @KODE = @KODE+1 
    END 
    ELSE SET @KODE=1 
    RETURN 'B' + LEFT('00',3-LEN(@KODE))+(@KODE) 
END 

只有上面的函數適用於B001通過B010,除此之外,它回到了B001。它不適用於B011,B012B120

之後,我嘗試用if else做到:

... 
DECLARE KODENYA CHAR (5) 
IF @KODE >= 0 AND @KODE <=9 
    BEGIN 
     SET @KODENYA = 'B' + LEFT('00',4-LEN(@KODE))+(@KODE) 
    END 
    ELSE IF @KODE >= 10 AND @KODE <=99 
    BEGIN 
     SET @KODENYA = 'B' + LEFT('0',4-LEN(@KODE))+(@KODE) 
    END 
    ELSE IF @KODE >= 100 AND @KODE <=999 
    BEGIN 
     SET @KODENYA = 'B' + LEFT('',4-LEN(@KODE))+(@KODE) 
    END 

    RETURN @KODENYA 

,結果還是一樣,不知何故,我得到@KODE如果它是超越9它返回nullSQL SERVER它讀成0

SQL SERVER有沒有另一種方法來創建這種類型的代碼?

+0

更改爲 「情況下」 與LEN –

+1

'B' +案例LEN(@KODE)當1然後'00'當2然後'0'當3然後''結束+ @ KODE –

+1

我通常會推薦*存儲*數字端口離開,並且將「B」和格式添加爲完全是應用程序問題,或者只是在計算列中。不要故意*存儲*格式化的文本。 –

回答

2

沒有必要對多個if /案例只是簡單的FORMAT

CREATE TABLE #tab(KODE INT); 
INSERT INTO #tab(KODE) VALUES (1),(2),(10),(99),(101),(100),(999); 

SELECT FORMAT(KODE, 'B00#') 
FROM #tab; 

LiveDemo

您可以輕鬆地轉換格式字符串'B000#'

調整它的長碼在你的情況下:

CREATE FUNCTION [dbo].[AUTO_CODE]() 
    RETURNS CHAR(4) 
AS 
BEGIN 
    DECLARE @KODE INT = (SELECT COUNT(KODE_BARANG)FROM BARANG); 

    RETURN FORMAT(@KODE, 'B00#'); 
END 

警告:

您函數可能返回重複/時的併發呼叫發生創建空白。

SqlFiddleDemo


根據您的需求,你可以考慮添加計算列到你的BARANG表:

CREATE TABLE BARANG(ID INT IDENTITY(1,1) PRIMARY KEY, 
        col2 VARCHAR(120) NOT NULL, 
        ... 
        KODE AS (FORMAT(ID, 'B00#')) 
);