0

我有一个现有的 VFP 数据库(dbf 文件),我想将它迁移到 SQL Server 2008。

问题是 :

我的 VFP 数据库中的表«发票»具有以下格式的主键:

                                    year+counter       

例如:对于 2013 年 --> 201300001、201300002、…、20130000n 对于 2012 年 --> 201200001、201200002、201200003、…..20120000n 等。

计数器必须在每年年初重置

为了计算这些序列,我从另一个 dbf 表中得到一个计数器,我将其递增并保存。在这里,我必须注意冲突和重复键的风险。我听到了很多关于身份列以及它如何避免我并发的信息。因为 sql 本身负责计算标识列。

根据所说,是否有解决方案?

谢谢你。

嗨 user2511414,我尝试了代替触发器,如下所示:

CREATE TRIGGER AutoIncrement_Trigger ON dblease.dbo.testAutoinc
instead OF INSERT AS
BEGIN
 DECLARE @ach CHAR
 DECLARE @ch CHAR
 DECLARE @num INT
 DECLARE @an  INT

 SET     @an  = year(GetDate())
 SET     @ach = Convert(char(4),@an)
select  @num = SUBSTRING(MAX(id),5,5) FROM dblease.dbo.testAutoinc having     SUBSTRING(MAX(id),1,4) = @ach

 INSERT INTO dblease.dbo.testAutoinc (id,designation,date) SELECT (@ach+CONVERT(VARCHAR(6),(@num+1))),inserted.designation, GetDate() FROM inserted
END

但是当执行以下查询时:

     insert into testAutoinc (designation, date) values ('TEST','25/06/2013');

我收到以下错误:无法将值 NULL 插入“Id”列,表“dblease.dbo.testAutoinc”;列不允许空值。插入失败。该语句已终止。

4

1 回答 1

0

您可以有一个用于年份的列,一个用于您的计数器 - 然后您可以使用计算列将它们连接到您的 year+counter 字段中。然后,这可以是您的主键,或者,您可能希望将代理键视为您的主键,并在您的 year+counter 字段上放置一个唯一索引。

要生成计数器编号,您可以使用触发器,或强制插入通过存储过程进行。取决于您是需要一次插入多行还是每次插入一行。

您可以为您的计数器使用标识列并在每年年初重置它(DBCC CHECKIDENT RESEED),这将避免使用触发器或过程,但意味着您(或您的继任者)必须记住重置它.

CREATE TABLE [dbo].[YearCounter](
    [YearId] [int] NULL,
    [Counter] [int] IDENTITY(1,1) NOT NULL,
    [Yc1]  AS (CONVERT([varchar](4),[YearId])+CONVERT([varchar](10),[Counter]))
)
ALTER TABLE [dbo].[YearCounter] ADD  CONSTRAINT [DF_YearCounter_YearId]  DEFAULT (datepart(year,getdate())) FOR [YearId]
于 2013-07-16T08:42:50.803 回答