我需要在表格中输入主键,如下格式
YYYY/MMM/NNNNNN
其中,YYYY
是当前年份,MMM
是月,NNNNNN
是来自000001, 000002, 000003, .... 999999
的序列号。
所以我的主键看起来像2012/Oct/000001
或2012/Oct/000010
....
如何生成此类代码..
我可以从Getdate()
功能获得年份和月份。但是如何管理每个插入的序列号。能不能给我逻辑呢?
答案 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)
为什么不考虑具有标识/数字列和日期列的复合键(或者如果不需要日期,年/月)?
这会给你相同的行为,并且实现/维护
可能会更简单一些我仍然想知道这背后的原因 - 这样我们就可以做出更好的教育猜测