Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 每年重置自动增量编号_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 每年重置自动增量编号

Sql server 每年重置自动增量编号,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我有一个带有job\u no的表格,该表格将自动递增到年度的最后两位数 示例:在2014年,工作编号如下:140001,140002,140003,它将保持增量直到下一年,即2015年,它将重置计数:150001,150002 碰巧我知道如何将日期和数字合并,但我仍然不知道如何让它每年重置。。我将非常感谢您的帮助,并将非常高兴能够清楚地看到解释和示例…您只需设置标识插入,并插入一行,其中包含您要使用的新起始值,然后将从该值开始插入 这有点违背数据库的正常形式,因为一个字段中有两个数据项。设置SQ

我有一个带有
job\u no
的表格,该表格将自动递增到年度的最后两位数

示例:在2014年,工作编号如下:
140001
140002
140003
,它将保持增量直到下一年,即2015年,它将重置计数:
150001
150002


碰巧我知道如何将日期和数字合并,但我仍然不知道如何让它每年重置。。我将非常感谢您的帮助,并将非常高兴能够清楚地看到解释和示例…

您只需设置标识插入,并插入一行,其中包含您要使用的新起始值,然后将从该值开始插入


这有点违背数据库的正常形式,因为一个字段中有两个数据项。

设置SQL代理作业,在12月31日午夜运行,并运行以下代码片段:

DBCC CHECKIDENT('table_name', RESEED, (YEAR(GETDATE()) % 100) * 10000)
请注意,此方法存在以下问题:

  • 如果您在给定的一年中在表中输入了10000条以上的记录,那么您的数字将在该年结束时出现错误
  • 此列中有两种不同类型的信息:标识值和年份。通常最好将这样的信息分开(即,只需使用标识列,然后还存储日期)
  • 你只有一年,而不是一个月或一天,如果不是现在,它在未来可能会有用

  • 在给定的一年中,分配给第10000个工作的工作编号是什么?实际上,一年中不会有超过三位的数字,但如果我添加了4位数字。问题是我需要将日期与数字一起附加,因为它应该自动插入到表中。我使用这个方法来完成我目前为止所做的:(right(CONVERT([varchar](4),datepart(year,getdate()),(0)),(2))+right('0000'+CONVERT([varchar](4),[Job_No_ID],(0)),(4)))如果Job_No_ID是一个标识列,则插入将失败,除非您将identity_insert dbo.table设置为ON(然后在完成时将其设置为off)@JeffHornby True,我假设它不是一个标识列。@AaronBertrand,谢谢你的帮助,但使用你的查询,在我插入的每一行中都不断重复“否”。@user3207594抱歉,有几个小错误。谢谢你的帮助,我按照你的建议完成了。
    DECLARE @y INT;
    SET @y = YEAR(GETDATE()) % 100; -- or YEAR(@DateOfJob) if you use a variable for that
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    BEGIN TRANSACTION;
    
    DECLARE @i INT;
    SELECT @i = MAX(job_no) FROM dbo.TableName WHERE job_no / 1000 = @y;
    
    SET @i = @y * 1000 + 1 + COALESCE(@i % 1000, 0);
    
    -- if job_no is an IDENTITY column, for some reason:
    -- SET IDENTITY_INSERT dbo.TableName ON;
    INSERT dbo.TableName(job_no, ...) VALUES(@i, ...);
    -- if job_no is an IDENTITY column, for some reason:
    -- SET IDENTITY_INSERT dbo.TableName OFF;
    
    COMMIT TRANSACTION;