請幫我寫一個自動生成的編號,如存儲過程...如何編寫生成唯一標識符的存儲過程?
ABC0000001
應該發生,因爲我們讓每個條目通過asp.net頁面。我的意思是每次頁面加載時都應該創建這個唯一的編號。
請幫我寫一個自動生成的編號,如存儲過程...如何編寫生成唯一標識符的存儲過程?
ABC0000001
應該發生,因爲我們讓每個條目通過asp.net頁面。我的意思是每次頁面加載時都應該創建這個唯一的編號。
我假設你想把這個數字存儲在數據庫的某個地方?所以也許這是一個插入存儲過程,添加一個新的頁面?
您將不得不在某處存儲數字,以便存儲過程知道下一個數字應該是什麼。所以......爲什麼不把它作爲一個整數存儲,用uniqueidentifier和identity插入 - 所以你添加的每一行都有下一個數字作爲ID。
如果你真的需要它在前面有'ABC',那麼當你返回值時,只需將它添加到存儲過程中的整數。
創建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'進入它。
下面的示例。您還可以添加請求日期時間的表,你也可以通過在你想存儲有關的要求,如引用其他信息,方法等
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
通常我會創建一個「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
聲明可確保電流值的方式,平行呼叫者在任何情況下獲得唯一的數字增加。
我已經做過類似的事情對於需要沿着這些線路的項目數量或什麼不同的業務對象:
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)
您應該添加入住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
請更新您的文章,包括你至今已寫成。 – dandan78 2011-03-10 13:56:34
爲什麼它需要'ABC'在正面,正常的身份有什麼問題?如果您需要額外的隔離代碼,則將其分開存儲並將其作爲串聯返回到視圖中。 – Lazarus 2011-03-10 13:56:56
@Cheta,像ABC300001一樣的數字是「XYZ0000001」...你至少需要描述你正在嘗試生成的模式*。 **一個例子沒有描述一個模式。** – Rob 2011-03-10 14:00:24