( 一 )
这个方式比较简单, 
在Storeprocedure的参数中给出
TableName;字段名称;规则; 通过返回值得到输出. 
![]()
![]() Sql Procedure
Sql Procedure
 1![]() set ANSI_NULLS ON
set ANSI_NULLS ON
 2![]() set QUOTED_IDENTIFIER ON
set QUOTED_IDENTIFIER ON
 3![]() go
go
 4![]()
 5![]() create Procedure [dbo].[Up_GetNewID]
create Procedure [dbo].[Up_GetNewID]
 6![]() @strTName            varchar(50), --Table name
 @strTName            varchar(50), --Table name
 7![]() @strFName        varchar(50),   -- Column Name
@strFName        varchar(50),   -- Column Name
 8![]() @strID            varchar(20),   --  ID
@strID            varchar(20),   --  ID
 9![]() @intIDBit        int,        --4
@intIDBit        int,        --4
10![]() @strSerialCode    varchar(1), --
@strSerialCode    varchar(1), --
11![]() @strYM            varchar(6),
@strYM            varchar(6),
12![]() @strPreFixID    varchar(10),
@strPreFixID    varchar(10),
13![]() @strNewID        varchar(20)    = '' Output
@strNewID        varchar(20)    = '' Output
14![]()
15![]() AS
AS
16![]() Begin
Begin            
17![]() Declare @strTempID        varchar(20)
    Declare @strTempID        varchar(20)
18![]() Declare @strZero        varchar(20)
    Declare @strZero        varchar(20)
19![]() Declare @strTempYM        varchar(6)
    Declare @strTempYM        varchar(6)
20![]() Declare @strTempSCode    varchar(20)
    Declare @strTempSCode    varchar(20)    
21![]() Declare @Query            varchar(8000)
    Declare @Query            varchar(8000)
22![]() 
        
23![]()
24![]()
25![]() Set @strZero=Replicate('0',@intIDBit)
    Set @strZero=Replicate('0',@intIDBit)
26![]()
27![]() If @strID<>''
    If @strID<>''
28![]() Set @strNewID=@strPreFixID + Left(@strID,Len(@strID) - (Len(@strSerialCode) + @intIDBit)) +
        Set @strNewID=@strPreFixID + Left(@strID,Len(@strID) - (Len(@strSerialCode) + @intIDBit)) + 
29![]() @strSerialCode +
                        @strSerialCode +                             
30![]() Right(@strZero + Cast(Cast(Right(@strID,@intIDBit) As int) + 1 As varchar),@intIDBit)
                        Right(@strZero + Cast(Cast(Right(@strID,@intIDBit) As int) + 1 As varchar),@intIDBit)
31![]() 
                     
32![]() Else
    Else
33![]() Begin
        Begin
34![]() If @strYM=''
            If @strYM=''        
35![]() Set @strTempYM = Cast(Year(GetDate()) As varchar) + Right('0' + Cast(Month(GetDate()) As varchar),2)
                Set @strTempYM = Cast(Year(GetDate()) As varchar) + Right('0' + Cast(Month(GetDate()) As varchar),2)
36![]() Else
            Else
37![]() Set @strTempYM=@strYM
                Set @strTempYM=@strYM
38![]()
39![]() If @strSerialCode=''
            If @strSerialCode=''
40![]() Set @strTempSCode=''
                Set @strTempSCode=''        
41![]() Else
            Else
42![]() Set @strTempSCode='+ Cast(' + @strSerialCode + ' As varchar(1)) '
                Set @strTempSCode='+ Cast(' + @strSerialCode + ' As varchar(1)) '
43![]() 
            
44![]() Set @Query = 'Select @strTempID = ' +
            Set @Query = 'Select @strTempID = ' + 
45![]() ' Top 1 ' + @strFName + ' ' +
                             ' Top 1 ' + @strFName + ' ' +
46![]() 'From ' + @strTName + ' ' +
                                'From ' + @strTName + ' ' +
47![]() 'Where Left(' + @strFName + ',len(' + @strFName + ')-' + Cast(@intIDBit As varchar) + ') =''' +
                            'Where Left(' + @strFName + ',len(' + @strFName + ')-' + Cast(@intIDBit As varchar) + ') =''' + 
48![]() @strPreFixID + @strTempYM + '''' + @strTempSCode + ' ' +
                                    @strPreFixID + @strTempYM + '''' + @strTempSCode + ' ' +
49![]() 'Order By ' + @strFName + ' Desc '
                            'Order By ' + @strFName + ' Desc '            
50![]() 
    
51![]() 
            
52![]() Exec(@Query)
            Exec(@Query)            
53![]() 
             
54![]()
55![]() If (@strTempID = '' Or @strTempID Is Null)
            If (@strTempID = '' Or @strTempID Is Null)
56![]() Set @strNewID = @strPreFixID + @strTempYM +
                Set @strNewID = @strPreFixID + @strTempYM +
57![]() @strSerialCode + Left(@strZero, Len(@strZero) - 1) + '1'
                                @strSerialCode + Left(@strZero, Len(@strZero) - 1) + '1'
58![]() Else
            Else
59![]()
60![]() Set @strNewID = Left(@strTempID, Len(@strTempID) - (Len(@strSerialCode) + @intIDBit)) +
                Set @strNewID = Left(@strTempID, Len(@strTempID) - (Len(@strSerialCode) + @intIDBit)) +
61![]() @strSerialCode +
                                @strSerialCode +
62![]() Cast(Right(@strZero + Cast(Cast(Right(@strTempID,@intIDBit) As int) + 1 As varchar),@intIDBit) As varchar)
                                Cast(Right(@strZero + Cast(Cast(Right(@strTempID,@intIDBit) As int) + 1 As varchar),@intIDBit) As varchar)
63![]() End
        End    
64![]() End
End
65![]()
66![]()
67![]()
 
Sample: 
new table : 
CREATE TABLE [dbo].[Leaves](
 
 [DocID] [nvarchar](200) NOT NULL,
 CONSTRAINT [Leaves_PK] PRIMARY KEY CLUSTERED 
(
 [DocID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
//得到iD
declare @strNewID varchar(20)
exec [GetNewID] 'dbo.Leaves' ,  'DocID' , '', 4 ,'' , '','L', @strNewID output
select  @strNewID
大家可以试一下。 
当然上面的这个格式也仅仅支持
{*}yyyymm####{几位} 的方式. 
( 二 )
后面继续我们写一个更多功能的编号自动生成