我正在使用SQL Server 2008 R2,我想创建一个触发器。
对于每个添加(仅添加),列将更新如下:
ABC-CurrentYear-AutoIncrementCode
例如:
ABC-2013-00001
或
ABC-2013-1
ABC
永远不会改变
当前年份可以添加YEAR(GetDate())
,但最后一部分,我遇到了困难:如何才能获得最后一个条目的最后一个条目+ 1?
第二个问题:
2014年,自动增量计数器应重置为1,2015年也是如此......
感谢您的支持。
答案 0 :(得分:0)
您可以像这样计算新值:
SELECT 'ABC-' +
CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-' +
RIGHT('00000' + CAST(ISNULL(MAX(CAST(REPLACE(YourColumnName, 'ABC-' + CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-', '') AS INTEGER)), 0) + 1 AS VARCHAR(5)), 5)
FROM YourTable
WHERE YourColumnName LIKE 'ABC-' + CAST(YEAR(GETDATE()) AS VARCHAR(4)) +'%'
字符串连接的最后一部分特别复杂:
答案 1 :(得分:0)
使用看起来像这样的样本表:
CREATE TABLE MyTable (id INT IDENTITY(1,1), someCol NVARCHAR(20), codeCol NVARCHAR(20))
有一个id列,一些随机值列和存储代码的第三列。
您的触发器可能如下所示:
CREATE TRIGGER tgInsertMyTable ON myTable
AFTER INSERT
AS
BEGIN
DECLARE @code NVARCHAR(20)
SELECT @code = 'ABC-' + CAST(YEAR(GETDATE()) AS NVARCHAR(4)) + '-'
DECLARE @max NVARCHAR(20)
SELECT @max = codeCol FROM dbo.myTable mts WHERE mts.codeCol LIKE @code + '%'
;WITH CTE_UPD AS
(
SELECT REPLICATE('0', 5-LEN(CAST(COALESCE(CAST(RIGHT(@max,5) AS INT),0) + ROW_NUMBER() OVER (ORDER BY ins.ID) AS NVARCHAR(5)))) + CAST(COALESCE(CAST(RIGHT(@max,5) AS INT),0) + ROW_NUMBER() OVER (ORDER BY ins.ID) AS NVARCHAR(5)) AS nextNo, id
FROM INSERTED ins
)
UPDATE mt
SET mt.CodeCol = @code + nextNo
FROM dbo.MyTable mt
INNER JOIN CTE_UPD ins ON ins.ID = mt.ID
END
我知道在某些地方看起来很复杂,所以我会尝试解释一下,但是 首先 - 这是一个它可以正常工作的演示:
<强> SQLFiddle DEMO 强>
所以,首先我在@code
变量中设置一个所需的代码前缀 - 这是没有增量的部分。
第二 - 我在表格中的现有行中搜索具有相同前缀的最大值 - 并将其存储在变量@max
第三部分是CTE - 它用于查找下一个增量值。
最后,只需将CTE连接到表并使用@code +计算值
进行更新我不确定,如果可能有一个更简单的解决方案,但这个有效 - 我认为涵盖了所有方案。
答案 2 :(得分:0)
但是在哪里使用这些函数。例如,如果Student表为RegNo。需要这个Auto-Year-Increment属性。应该写一个代码吗?在存储过程中或其他地方。