主键自动复位增量值

时间:2013-11-18 21:15:44

标签: sql-server-2008 key

我有一个问题,即使用两个数据元素和一个自动递增的值为表创建主键。

我有一张包含
的表 数据集 - 三个字母的缩写和
DEPOSITDATE

我想为这个表创建一个主键,它将dataset和depositDate与一个自动递增的值组合在一起。

我可以使用一个不断增大的值来创建此列,但我想要的是每天都要重置它。

例如,在2013年11月8日的ACA中,当天的第一个插入标识符为:
ACA-110813-01
第二个:
 ACA-110813-02
等等

然后,2013年11月9日的第一次插入将是:
ACA0-110913-01

这是否可以在表创建中或通过任何存储过程或触发器实现?

我正在使用SQLServer 2008

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是使用存储过程将数据插入到我的表中。

我在目标表(ledgers.deposits)中创建了一个名为depositNum的列,这是我将要递增的值。

CREATE TABLE [Ledgers].[Deposits]
(
[Dataset] [nvarchar](3), 
[DepositDate] [date], 
[Payer] [nvarchar](100), 
[CheckNum] [nvarchar](100), 
[CheckAmt] [decimal](18, 2),
[depositNum] [bigint], 
[depositId]  AS ((((((CONVERT([nvarchar],[Dataset],0)+'-')+    CONVERT([nvarchar],datepart(month,[DepositDate]),0))+CONVERT([nvarchar],datepart(day,[DepositDate]),0))+CONVERT([nvarchar],datepart(year,[DepositDate]),0))+'-')+CONVERT([nvarchar],[depositNum],0))))

我使用存储过程插入数据,该存储过程将根据数据集和日期递增depositNum。然后将该值连接到我设置为主键的depositId列。

以下是插入数据并增加depositNum的存储过程。

CREATE PROCEDURE [Ledgers].[insertDeposit]
@dataset nvarchar(3),
@depositDate date, 
@payer nvarchar(100),
@checkNum nvarchar(100),
@depositAmt decimal(18,2)


AS

insert into Ledgers.Deposits 
values(
@dataset, 
@depositDate,
@payer, 
@checkNum, 
@depositAmt,
(
select ISNULL(max(depositNum+1), 1) 
from Ledgers.Deposits
where Dataset=@dataset and DepositDate=@depositDate
))


希望这是有道理的。