2013-06-04 49 views
1

我的表:在存儲上創建杬程序自動遞增

CREATE TABLE USER_DATA 
([ID] NVARCHAR(10),[NAME] NVARCHAR(50)) 

我的存儲過程:

CREATE PROC SP_INSERT_USER 
@NAME VARCHAR(50) 
AS 
BEGIN 
DECLARE @ID NVARCHAR(50) 
DECLARE @IDTEMP INT 
SELECT @IDTEMP=MAX(CAST(RIGHT([ID],3) AS INT)) FROM USER_DATA 
SELECT @IDTEMP=CASE WHEN @IDTEMP IS NULL THEN 1 ELSE @IDTEMP+1 END 
SELECT @ID='RP'+RIGHT(('000'+CAST(@IDTEMP AS VARCHAR(10))),3) 
INSERT INTO USER_DATA VALUES (@ID,@NAME) 
END 

輸入:

SP_INSERT_USER 'Ajit' 
SP_INSERT_USER 'Amit' 

輸出:

ID   NAME 
---------- -------------------------------------------------- 
RP001  Ajit 
RP002  Amit 

此代碼工作正常。但是ID是固定的。它僅限於3位像001,002等,如果它獲得的第1000員工,它無法正常顯示。有沒有辦法讓它動態而不固定長度?

+4

不要這樣做。只需使用一個'IDENTITY'列。表示層可以追加'RP'和前導零,如果這是必要的。當同時調用你的'SP_INSERT_USER'程序是不安全的(也避免了'sp_'前綴,因爲這是保留給Microsoft的系統程序) –

+0

Thanks..but我想在SQL server..in SP(存儲過程)的代碼 – Pearl

+2

方注意:你不應該**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

回答

1

嘗試這一個 -

CREATE TABLE dbo.USER_DATA 
(
     PK INT IDENTITY(1,1) PRIMARY KEY 
    , ID AS 'PR' + RIGHT('00' + CAST(PK AS VARCHAR(5)), 5) 
    , NAME NVARCHAR(50) 
) 

GO 

CREATE PROC dbo.SP_INSERT_USER 

    @NAME VARCHAR(50) 

AS BEGIN 

    INSERT INTO dbo.USER_DATA 
    VALUES (@NAME) 

END 

GO 

EXEC dbo.SP_INSERT_USER 'Ajit' 
EXEC dbo.SP_INSERT_USER 'Amit' 

SELECT ID, NAME 
FROM dbo.USER_DATA 
+0

將高達PR009正確地增加。之後它不會正確增加。那將是PR0010它的錯誤。它想成爲PR010 ....請改變這個解決方案 – kasim