2010-12-10 58 views
0

我正在使用存儲過程爲productid增加1的字母數字值。我的程序將值增加到10個記錄,一旦達到PRD0010的第10個值,就不會增加......但是,問題在於,對於每個SP調用,重複 相同的值PRD0010 ..爲什麼在此SQL存儲過程中創建重複的自然ID?

這可能是什麼原因造成的?

create table tblProduct 
(
     id varchar(15) 
) 

insert into tblProduct(id)values('PRD00') 

create procedure spInsertInProduct 
AS 
Begin 

    DECLARE @PId VARCHAR(15) 
    DECLARE @NId INT 
    DECLARE @COUNTER INT 
    SET @PId = 'PRD00' 
    SET @COUNTER = 0 
    SELECT @NId = cast(substring(MAX(id), 4, len(MAX(id))) as int) 
    FROM tblProduct group by left(id, 3) order by left(id, 3) 
    --here increse the vlaue to numeric id by 1 
    SET @NId = @NId + 1 
    --GENERATE ACTUAL APHANUMERIC ID HERE 
    SET @PId = @PId + cast(@NId AS VARCHAR) 
    INSERT INTO tblProduct(id)values (@PId) 

END 

回答

3

變化

SELECT @NId = cast(substring(MAX(id), 4, len(MAX(id))) as int) 
    FROM tblProduct group by left(id, 3) order by left(id, 3) 

SELECT TOP 1 
     @NId = cast(substring(id, 4, len(id)) as int) 
FROM tblProduct order by LEN(id) DESC, ID DESC 

你要記住,

PRD009 

總是大於

PRD0010 

PRD001 

總而言之,我覺得你的做法是不正確。

你的價值觀會

PRD00 
PRD001 
... 
PRD009 
PRD0010 
PRD0011 
... 
PRD0099 
PRD00100 

這將使整理一個完整的噩夢。

+0

astander->正是你是對的...它的工作fine..thanks烏拉圭回合的答覆 – Jims 2010-12-10 06:17:28

0

除了旁觀者的分析,你也有一個併發問題。

簡單的解決將是你的PROC年初補充一點:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION 

,並在末尾加上COMMIT。否則,這個存儲過程的兩個調用者將從您的表中獲得相同的MAX/TOP 1值,並插入相同的值。

另外,您可以並應該通過向表中添加一個鍵來防止這些重複項的存在。如果此表上已有PRIMARY KEY,則可以使用UNIQUE約束添加其他密鑰。這將防止未來發生重複,無論發生什麼編程錯誤。例如。

ALTER TABLE tblProduct ADD CONSTRAINT UQ_Product_ID UNIQUE (ID) 
相關問題