在每个插入的SQL中生成序列号

时间:2012-10-30 09:39:34

标签: sql sql-server

我需要在表格中输入主键,如下格式

YYYY/MMM/NNNNNN

其中,YYYY是当前年份,MMM是月,NNNNNN是来自000001, 000002, 000003, .... 999999的序列号。

所以我的主键看起来像2012/Oct/0000012012/Oct/000010 ....

如何生成此类代码..

我可以从Getdate()功能获得年份和月份。但是如何管理每个插入的序列号。能不能给我逻辑呢?

4 个答案:

答案 0 :(得分:4)

到目前为止,最简单的方法是让SQL Server使用INT IDENTITY列处理连续数字中的抛出 - 然后使用触发器创建您需要的特定格式,在另一栏中。

所以给出了这个表:

CREATE TABLE SampleTable 
             (ID INT IDENTITY, SaleDate DATE, ComputedPK VARCHAR(25) )

您可以使用这样的触发器来计算ComputedPK(自动编号,由SQL Server处理)和ID作为日期列的SaleDate

CREATE TRIGGER trgSampleTableInsert
ON dbo.SampleTable FOR INSERT
AS 
    UPDATE dbo.SampleTable
    SET ComputedPK = CAST(YEAR(i.SaleDate) AS CHAR(4)) + '/' + DATENAME(MONTH, i.SaleDate) + '/' + RIGHT('000000' + CAST(i.ID AS VARCHAR(6)), 6) 
    FROM dbo.SampleTable s
    INNER JOIN INSERTED i ON s.ID = i.ID

这种方法每月从1开始,但是真的需要吗?不是一个连续的数字(甚至几个月)还不够好吗?

更新:当然,如果您使用SQL Server 2012 (您没有指定版本您正在使用的SQL Server ...) - 您可以使用SEQUENCE对象来处理连续编号 - 您甚至可以在每个月初开始将该序列重置为1 ....

答案 1 :(得分:1)

SELECT 
CONCAT(
      DATEPART(YEAR, GETDATE()),
      '/',
      DATENAME(MONTH,GETDATE()),
      '/',
      REPLACE(STR(((SELECT COUNT(*) FROM yourtable WHERE monthname = DATENAME(MONTH,GETDATE()) GROUP BY monthname) + 1),6,0),' ','0')
  )
  )

未经测试 now tested。您必须添加一个月份名称列(有一种方法可以在不添加列的情况下执行此操作,但这是最方便的)

如果您不想依赖concat,也可以投射和使用添加。 http://sqlfiddle.com/#!6/3e43d/6

答案 2 :(得分:0)

将主键设置为两列。其中一个代表Daten,另一个代表Serial number。在Serial列上设置自动增加的序列。这样可以更轻松地过滤Key的Date部分。

答案 3 :(得分:0)

为什么不考虑具有标识/数字列和日期列的复合键(或者如果不需要日期,年/月)?

这会给你相同的行为,并且实现/维护

可能会更简单一些

我仍然想知道这背后的原因 - 这样我们就可以做出更好的教育猜测