1

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

YYYY/MMM/NNNNNN

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

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

我怎样才能生成这种类型的代码..

Getdate()我可以从函数中获取年份和月份。但是我如何管理每个插入的序列号。你能给我一个逻辑吗?

4

4 回答 4

4

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

所以给定这张表:

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

您可以使用这样的触发器来计算ComputedPKID自动编号,由 SQL Server 处理)和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 ....

于 2012-10-30T09:56:42.317 回答
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')
  )
  )

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

如果您不想依赖 concat,也可以强制转换和使用加法。http://sqlfiddle.com/#!6/3e43d/6

于 2012-10-30T09:50:42.413 回答
0

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

这将为您提供相同的行为,并且可能更易于实现/维护

我仍然想知道这背后的原因——这样我们才能做出更有根据的猜测

于 2012-10-30T09:55:17.237 回答
0

在两列上设置您的主键。其中一个代表 ,Daten另一个代表Serial numberSerial在自动增加的列上设置一个序列。这将使您更容易过滤密钥的日期部分。

于 2012-10-30T09:47:46.863 回答