T-SQL利用触发器自动生成单据编号

昨天面试题中遇到根据日期生成单据编号的题目,生成的格式为:P200810100001(即是PyyyyMMdd0000),后面是4位数字,按照该天记录数累加。

例如:

P200810090001

P200810100001

P200810100002

P200810110001

P200810110002

P200810110003

 

建表SQL:

USE [TestDB]
GO
/****** 对象:  Table [dbo].[TableA]    脚本日期: 10/10/2008 09:01:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TableA](
    [pkid] [int] IDENTITY(1,1) NOT NULL,
    [name] [nchar](10) NULL,
    [pid] [varchar](13) NULL,
CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED
(
    [pkid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

 

触发器SQL:

USE [TestDB]
GO
/****** 对象:  Trigger [dbo].[Trigger_Insert]    脚本日期: 10/09/2008 17:32:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Trigger_Insert]
   ON  [dbo].[TableA]
   After INSERT
AS
BEGIN
    declare @pkid int,@pid varchar(14),@temppid varchar(14)
    --从Inserted表中取得主键的自动编号
    select @pkid=pkid from Inserted
    --获取当前日期格式为"P20081010"
    select @pid = 'P' + Convert(varchar(8),GetDate(),112);
    --获取最后一个PID
    select top 1 @temppid=pid from TableA where pid like @pid+'%' order by pkid desc
    if (@temppid is null)
        begin
            --如果今天没有插入过数据,则初始值为'P200810100001'
            set @pid = @pid + '0001'
        end
    else
        begin
            --否则从最后一个日期取得编号,并末尾加上1,组成新编号
            set @pid = @pid + right(cast(power(10,4) as varchar)+(convert(int,substring(@temppid,10,4))+1),4)
        end

    --更新编号
    update TableA set pid=@pid where pkid = @pkid
END

 

插入测试数据SQL:

INSERT INTO [TestDB].[dbo].[TableA]([name]) VALUES (N'李四')
go
INSERT INTO [TestDB].[dbo].[TableA]([name]) VALUES (N'张三')
go

 

图示:

image

转载于:https://www.cnblogs.com/soncy/archive/2008/10/10/1307754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值