我需要在表格中输入主键,格式如下
YYYY/MMM/NNNNNN
其中,YYYY
是当前年份,MMM
是月份,并且NNNNNN
是来自 的序列号000001, 000002, 000003, .... 999999
。
所以我的主键看起来像2012/Oct/000001
或2012/Oct/000010
....
我怎样才能生成这种类型的代码..
Getdate()
我可以从函数中获取年份和月份。但是我如何管理每个插入的序列号。你能给我一个逻辑吗?
我需要在表格中输入主键,格式如下
YYYY/MMM/NNNNNN
其中,YYYY
是当前年份,MMM
是月份,并且NNNNNN
是来自 的序列号000001, 000002, 000003, .... 999999
。
所以我的主键看起来像2012/Oct/000001
或2012/Oct/000010
....
我怎样才能生成这种类型的代码..
Getdate()
我可以从函数中获取年份和月份。但是我如何管理每个插入的序列号。你能给我一个逻辑吗?
到目前为止,最简单的方法是让 SQL Server 使用列处理连续数字的抛出INT IDENTITY
- 然后使用触发器在单独的列中创建您需要的特定格式。
所以给定这张表:
CREATE TABLE SampleTable
(ID INT IDENTITY, SaleDate DATE, ComputedPK VARCHAR(25) )
您可以使用这样的触发器来计算ComputedPK
(ID
自动编号,由 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 ....
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
为什么不考虑一个具有标识/数字列和日期列的复合键(或者如果不需要日期,则为年/月)?
这将为您提供相同的行为,并且可能更易于实现/维护
我仍然想知道这背后的原因——这样我们才能做出更有根据的猜测
在两列上设置您的主键。其中一个代表 ,Daten
另一个代表Serial number
。Serial
在自动增加的列上设置一个序列。这将使您更容易过滤密钥的日期部分。