2011-03-10 92 views
0

請幫我寫一個自動生成的編號,如存儲過程...如何編寫生成唯一標識符的存儲過程?

ABC0000001

應該發生,因爲我們讓每個條目通過asp.net頁面。我的意思是每次頁面加載時都應該創建這個唯一的編號。

+3

請更新您的文章,包括你至今已寫成。 – dandan78 2011-03-10 13:56:34

+2

爲什麼它需要'ABC'在正面,正常的身份有什麼問題?如果您需要額外的隔離代碼,則將其分開存儲並將其作爲串聯返回到視圖中。 – Lazarus 2011-03-10 13:56:56

+2

@Cheta,像ABC300001一樣的數字是「XYZ0000001」...你至少需要描述你正在嘗試生成的模式*。 **一個例子沒有描述一個模式。** – Rob 2011-03-10 14:00:24

回答

0

我假設你想把這個數字存儲在數據庫的某個地方?所以也許這是一個插入存儲過程,添加一個新的頁面?

您將不得不在某處存儲數字,以便存儲過程知道下一個數字應該是什麼。所以......爲什麼不把它作爲一個整數存儲,用uniqueidentifier和identity插入 - 所以你添加的每一行都有下一個數字作爲ID。

如果你真的需要它在前面有'ABC',那麼當你返回值時,只需將它添加到存儲過程中的整數。

0

創建UDF PADL如下:

CREATE function PADL (@cSrting nvarchar(4000), @nLen smallint, @cPadCharacter nvarchar(4000) = ' ') 
returns nvarchar(4000) 
as 
     begin 
     declare @length smallint, @lengthPadCharacter smallint 
     select @length = datalength(@cSrting)/(case SQL_VARIANT_PROPERTY(@cSrting,'BaseType') when 'nvarchar' then 2 else 1 end) -- for unicode 
     select @lengthPadCharacter = datalength(@cPadCharacter)/(case SQL_VARIANT_PROPERTY(@cPadCharacter,'BaseType') when 'nvarchar' then 2 else 1 end) -- for unicode 

     if @length >= @nLen 
      set @cSrting = left(@cSrting, @nLen) 
     else 
     begin 
       declare @nLeftLen smallint, @nRightLen smallint 
       set @nLeftLen = @nLen - @length -- Quantity of characters, added at the left 
       set @cSrting = left(replicate(@cPadCharacter, ceiling(@nLeftLen/@lengthPadCharacter) + 2), @nLeftLen)+ @cSrting 
      end 

    return (@cSrting) 
    end 
GO 

您可以使用一個表來存儲當前的數量和獲得下一個數字,並使用PADL UDF墊與所需數量的「0」,然後CONCAT 'ABC'進入它。

0

下面的示例。您還可以添加請求日期時間的表,你也可以通過在你想存儲有關的要求,如引用其他信息,方法等

create table RequestRecords (
    ixRequestRecord int identity primary key, 
    sWhatever nvarchar(max) -- anything else you want to store 
) 

Create proc WebNewRequestEntry(@sWhatever nvarchar(max) 
as 
begin 
    insert RequestRecords(sWhatever) select @sWhatever 
    select 'ABC'+right('00000000000000' + cast(@@IDENTITY_INSERT as varchar(10)), 10) as sRequestRecord 
end 
0

通常我會創建一個「NumberSeries」表,其中存儲號碼系列的名稱,最小號碼,最大號碼,前綴(在您的情況下爲ABC)和當前值。然後,對於併發的緣故,我創建了以下存儲過程:

CREATE PROCEDURE [dbo].[spGetNextNo] 
    @series NVARCHAR(20) 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @prefix NVARCHAR(10) 
DECLARE @result NVARCHAR(50) 
DECLARE @currvalue BIGINT 
DECLARE @maxvalue BIGINT 
DECLARE @errmsg NVARCHAR(250) 

-- Find max value for number series 
SELECT @prefix = Prefix, @maxvalue = EndValue FROM NumberSeries WHERE Series = @series 
IF (@maxvalue IS NULL) 
BEGIN 
    SET @errmsg = 'Number series "'[email protected]+'" does not exist!' 
    RAISERROR(@errmsg, 16, 1) 
    RETURN 
END 

-- Create next number 
DECLARE @MyTableVar TABLE (CurrValue BIGINT) 
UPDATE tNumberSeries 
SET 
    CurrentValue = CurrentValue + 1 
OUTPUT INSERTED.CurrentValue INTO @MyTableVar 
WHERE 
    Series = @series 

-- Number series used up? 
SELECT TOP 1 @currvalue = CurrValue FROM @MyTableVar  
IF (@currvalue >= @maxvalue) 
BEGIN 
    SET @errmsg = 'Number series "'[email protected]+'" is used up!' 
    RAISERROR(@errmsg, 16, 1) 
    RETURN 
END 

SET @result = CAST(@currvalue AS NVARCHAR) 
IF @prefix IS NOT NULL 
    SET @result = @prefix + @result 

-- Return prefixed result 
SELECT @result AS CurrentValue 
RETURN 0 

END 

UPDATE/OUTPUT聲明可確保電流值的方式,平行呼叫者在任何情況下獲得唯一的數字增加。

2

我已經做過類似的事情對於需要沿着這些線路的項目數量或什麼不同的業務對象:

declare @maxnum int 
declare @myNumber @varchar(32) 
select @maxnum = max(columnName) + 1 from theTable 
select @myNumber = 'ABC' + replicate('0', 8 - len(@maxnum)) + cast(@maxnum as varchar) 
0

您應該添加入住constraint包含該字段的表:

([ABC_Number] IS NOT NULL AND len([ABC_Number])=(10) AND substring([ABC_Number],(1),(3))='ABC' AND substring([ABC_Number],(4),(7)) like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]') 

通過這種方式,您可以確保從某處注入無效unique-identifier-format的記錄是不可能的。

和獨特的約束,以確保一些未在表中重複:

[dbo].[_CountAbcNumber]([abc_number])<(2) 

其中_CountAbcNumber是這樣的UDF:

CREATE FUNCTION [dbo].[_CountAbcNumber](
    @AbcNumber AS nchar(10) 
) 

RETURNS int AS BEGIN 
    declare @retVal int 

    select @retVal = max(occurrences) 
    from ( 
     select ABC_NUMBER, count(*) as occurrences 
     from dbo.YourTable    
     where ABC_NUMBER = @AbcNumber 
     group by ABC_NUMBER 
    ) tmp 
    return @retVal; 
END