自动生成流水号-单一StoreProcedure方式
2006-10-11 15:38
309 查看
( 一 )
这个方式比较简单,
在Storeprocedure的参数中给出
TableName;字段名称;规则; 通过返回值得到输出.
set ANSI_NULLS ON
2set QUOTED_IDENTIFIER ON
3go
4
5create Procedure [dbo].[Up_GetNewID]
6 @strTName varchar(50), --Table name
7@strFName varchar(50), -- Column Name
8@strID varchar(20), -- ID
9@intIDBit int, --4
10@strSerialCode varchar(1), --
11@strYM varchar(6),
12@strPreFixID varchar(10),
13@strNewID varchar(20) = '' Output
14
15AS
16Begin
17 Declare @strTempID varchar(20)
18 Declare @strZero varchar(20)
19 Declare @strTempYM varchar(6)
20 Declare @strTempSCode varchar(20)
21 Declare @Query varchar(8000)
22
23
24
25 Set @strZero=Replicate('0',@intIDBit)
26
27 If @strID<>''
28 Set @strNewID=@strPreFixID + Left(@strID,Len(@strID) - (Len(@strSerialCode) + @intIDBit)) +
29 @strSerialCode +
30 Right(@strZero + Cast(Cast(Right(@strID,@intIDBit) As int) + 1 As varchar),@intIDBit)
31
32 Else
33 Begin
34 If @strYM=''
35 Set @strTempYM = Cast(Year(GetDate()) As varchar) + Right('0' + Cast(Month(GetDate()) As varchar),2)
36 Else
37 Set @strTempYM=@strYM
38
39 If @strSerialCode=''
40 Set @strTempSCode=''
41 Else
42 Set @strTempSCode='+ Cast(' + @strSerialCode + ' As varchar(1)) '
43
44 Set @Query = 'Select @strTempID = ' +
45 ' Top 1 ' + @strFName + ' ' +
46 'From ' + @strTName + ' ' +
47 'Where Left(' + @strFName + ',len(' + @strFName + ')-' + Cast(@intIDBit As varchar) + ') =''' +
48 @strPreFixID + @strTempYM + '''' + @strTempSCode + ' ' +
49 'Order By ' + @strFName + ' Desc '
50
51
52 Exec(@Query)
53
54
55 If (@strTempID = '' Or @strTempID Is Null)
56 Set @strNewID = @strPreFixID + @strTempYM +
57 @strSerialCode + Left(@strZero, Len(@strZero) - 1) + '1'
58 Else
59
60 Set @strNewID = Left(@strTempID, Len(@strTempID) - (Len(@strSerialCode) + @intIDBit)) +
61 @strSerialCode +
62 Cast(Right(@strZero + Cast(Cast(Right(@strTempID,@intIDBit) As int) + 1 As varchar),@intIDBit) As varchar)
63 End
64End
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####{几位} 的方式.
( 二 )
后面继续我们写一个更多功能的编号自动生成
这个方式比较简单,
在Storeprocedure的参数中给出
TableName;字段名称;规则; 通过返回值得到输出.
set ANSI_NULLS ON
2set QUOTED_IDENTIFIER ON
3go
4
5create Procedure [dbo].[Up_GetNewID]
6 @strTName varchar(50), --Table name
7@strFName varchar(50), -- Column Name
8@strID varchar(20), -- ID
9@intIDBit int, --4
10@strSerialCode varchar(1), --
11@strYM varchar(6),
12@strPreFixID varchar(10),
13@strNewID varchar(20) = '' Output
14
15AS
16Begin
17 Declare @strTempID varchar(20)
18 Declare @strZero varchar(20)
19 Declare @strTempYM varchar(6)
20 Declare @strTempSCode varchar(20)
21 Declare @Query varchar(8000)
22
23
24
25 Set @strZero=Replicate('0',@intIDBit)
26
27 If @strID<>''
28 Set @strNewID=@strPreFixID + Left(@strID,Len(@strID) - (Len(@strSerialCode) + @intIDBit)) +
29 @strSerialCode +
30 Right(@strZero + Cast(Cast(Right(@strID,@intIDBit) As int) + 1 As varchar),@intIDBit)
31
32 Else
33 Begin
34 If @strYM=''
35 Set @strTempYM = Cast(Year(GetDate()) As varchar) + Right('0' + Cast(Month(GetDate()) As varchar),2)
36 Else
37 Set @strTempYM=@strYM
38
39 If @strSerialCode=''
40 Set @strTempSCode=''
41 Else
42 Set @strTempSCode='+ Cast(' + @strSerialCode + ' As varchar(1)) '
43
44 Set @Query = 'Select @strTempID = ' +
45 ' Top 1 ' + @strFName + ' ' +
46 'From ' + @strTName + ' ' +
47 'Where Left(' + @strFName + ',len(' + @strFName + ')-' + Cast(@intIDBit As varchar) + ') =''' +
48 @strPreFixID + @strTempYM + '''' + @strTempSCode + ' ' +
49 'Order By ' + @strFName + ' Desc '
50
51
52 Exec(@Query)
53
54
55 If (@strTempID = '' Or @strTempID Is Null)
56 Set @strNewID = @strPreFixID + @strTempYM +
57 @strSerialCode + Left(@strZero, Len(@strZero) - 1) + '1'
58 Else
59
60 Set @strNewID = Left(@strTempID, Len(@strTempID) - (Len(@strSerialCode) + @intIDBit)) +
61 @strSerialCode +
62 Cast(Right(@strZero + Cast(Cast(Right(@strTempID,@intIDBit) As int) + 1 As varchar),@intIDBit) As varchar)
63 End
64End
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####{几位} 的方式.
( 二 )
后面继续我们写一个更多功能的编号自动生成
相关文章推荐
- 自动生成流水号, sql 方式, class 方式, ( 有待完成)
- 【转载】利用"SQL"语句自动生成序号的两种方式。
- 为我们的安卓app自动生成桌面快捷方式
- Android 自动编译、打包生成apk文件 1 - 命令行方式
- 导入别人的项目时,工程中不自动生成Android Dependencies的解决方式
- Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式
- Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式
- WPS用样式法自定义的方式自动生成目录
- 从数据到代码-基于T4的VS代码自动生成方式
- findviewbyid和注解方式的自动生成工具
- SQL自动生成流水号
- IDEA中自动生成get/set的方式
- mybatis-generator 代码自动生成工具使用讲解(maven方式)
- 《Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式》
- java实现自动生成流水号
- java单机生成不重复增长15位流水号方式
- iPhone开发之创建简单界面视图的三种方式之一 使用xcode4自动生成界面
- Android 自动编译、打包生成apk文件 1 - 命令行方式
- Hibernate中自动生成数据库表的两种方式
- JAVA自动生成sql结果到excel,并以附件方式发送到指定邮箱