2010-12-18 63 views
2

我寫這篇文章alghorithm和它是正確的: 表爲:如何創建SQL Server中的自定義字母數字的主鍵2005

create table PrimKeyTest (primarykeycolumn varchar(8), nextcolumn int) 
GO 
insert into PrimKeyTest values ('P09-0001', 1) 
GO 

和我的作用是:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
CREATE function [dbo].[GetSpecialPrimaryKey](@yearvalue int) 
returns nvarchar(8) 
as 

begin 

    declare @maxkey varchar(4) 
    declare @maxLength int, @maxkeylength int 

    set @maxLength = 4 

select @maxkey = ISNULL(cast(max(cast(substring(primaryKeycolumn, 5, 4) as integer)+1) as varchar),'1') 
from PrimKeyTest 
     where substring(primaryKeycolumn, 2, 2) = substring(convert(varchar, @yearvalue), 3, 2) 

    set @maxkeylength = len(@maxkey) 

    while @maxkeylength < @maxLength 
    begin 
     set @maxkey = '0' + @maxkey 
     set @maxkeylength = len(@maxkey) 
    end 

    return 'P' + substring(convert(varchar, @yearvalue), 3, 2) + '-' + @maxkey 

end 

現在,當我刪除該表的最後一行時,新的最後一條記錄給出正確的編號,例如。 P09-0001 P09-0002 P09-0003 P09-0004 P09-0005 但是當我刪除此表的第二行主列的順序有不正確的 例如。 P09-0001 P09-0003 P09-0004 P09-0005 你能幫我嗎? 我想要這個:P09-0001 P09-0002 P09-0003 P09-0004

回答

3

這實際上不是一個很好的處理主鍵的方法。這樣做意味着每當一個被刪除時(除非是最後一個),「重新對齊」所有的pkey。這樣做可能是一個複雜,昂貴且容易出錯的過程。例如,你在這個表中有一個pkey,它可能會通過其他表中的外鍵引用。如果您更改第一個表中的pkey的值,則還必須在引用它的所有其他表中對其進行更改。這意味着放棄對更改期間的任何限制等。

看起來您正試圖創建一個標識符,該標識符很可能會呈現給最終用戶。你可以繼續使用你的功能來做到這一點,但不要把它作爲主鍵。使用自動遞增列作爲主鍵,'P09-N'值作爲單獨的字段。然後,如果您想要修改這些值,而不影響表格的其餘設計。

現在,無論何時刪除標識符值,都可能需要在存儲過程中使用遊標。這是一個很好的overview on cursors。您也可以使用CTE(公用表表達式)來執行updating

這裏是一個光標例子Col1中是你的p鍵和col2上是要更改標識:我沒有做前導零邏輯

begin tran -- it's important to wrap this in a transaction! 

declare @counter int 
set @counter = 1 
declare @val varchar(50) 

DECLARE crs CURSOR 
FOR SELECT Col1 FROM TblTest ORDER By Col1 

OPEN crs 
FETCH NEXT FROM crs INTO @val 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    UPDATE TblTest 
    SET Col2 = 'P09-' + cast(@counter as varchar(50)) 
    WHERE Col1 = @val 

    SET @counter = @counter + 1 

    FETCH NEXT FROM crs INTO @val 
END 
CLOSE crs 
DEALLOCATE crs 

commit tran 

,但你可以谷歌是很容易。

+1

+1也許他不想重新排序主鍵,而只是重用已刪除的鍵。但是這聽起來不是一個好主意。 – 2010-12-18 18:04:39

+0

哇!非常感謝你 。 <<保羅薩西克你是最棒的>> – hamed 2010-12-19 04:04:42

相關問題