gpt4 book ai didi

asp.net - 在插入时获取下一个数字,在新的一年重置为 0

转载 作者:行者123 更新时间:2023-12-05 04:18:46 24 4
gpt4 key购买 nike

我正在将文档保存到数据库中,每个文档都必须有一个格式为 YYYY-00000 的 ID:

  • 前4个字符是当前年份
  • 后五个字符是数字。它们每年从 1 开始,然后递增。

例如,我的数据库中可以包含这些文档:2011-00001、2011-00002、2011-00003、2012-00001、2012-00002 ...

我是这样想的:

  • 向文档表添加两列(年份和编号)
  • Year 是计算列,类似于 year(getdate())
  • Number 是计算列,它从函数 GetNextNumberForCurrentYear
  • 获取值
  • GetNextNumberForCurrentYear 返回当前年份的下一个数字(例如,select max(Number) + 1 from Documents where Year = year(getdate()),有些是空检查)

但我担心,两个用户可能想同时保存文档,并且他们会收到相同的编号。这可能吗?有更好的想法吗?

它是一个 ASP.NET C# web 应用程序,.NET 4.0,MSSQL 2005,我可以控制应用程序的所有部分。

PS:插入后我想将新文档的 Id 返回给用户,所以我可能不得不做类似的事情:select Id from Documents where SomeId = scope_identity(),所以我想某处应该有一个标识列...?

编辑(最终解决方案):我从存储过程中获取下一个数字,在 .NET 中构建文档的 ID(格式为 YYYY-00001),将整个文档保存到数据库(对整个过程使用 TransactionScope),然后然后将 Id 返回给用户。

create table DocumentNumbers ([Year] int not null, Number int not null default 1)
insert into DocumentNumbers ([Year], Number)
select 2012, 1 -- and more...

create procedure GetNextDocumentNumber
@year int
as
begin
declare @myResult table (nextNumber int)

update DocumentNumbers
set Number = isnull(Number, 0) + 1
output inserted.Number into @myResult
where [Year] = @year

select top 1 nextNumber from @myResult
end

最佳答案

您可以创建一个表 NumberSeries,其中包含一列 Year 和一列 CurrentNo 以及一个从中返回下一个数字的函数像下面这样:

DECLARE @myResult TABLE (nextNumber INT)

UPDATE NumberSeries
OUTPUT INSERTED.NextNo INTO @myResult
SET
CurrentNo = ISNULL(CurrentNo, 0) + 1
WHERE
Year = Year(GetDate())

DECLARE @result INT
@result = (SELECT TOP 1 nextNumber FROM @myResult)

RETURN @result

这会自动更新 NumberSeries 表并将新值插入到 @myResult 表变量中。之后,它返回 @myResult 表变量中的第一个(也是唯一一个)值。

其他一切,如 SCOPE_IDENTITY() 等都可能在使用触发器或其他情况下导致错误 - 使用 OUTPUT 子句的解决方案是安全的。

编辑
至于返回插入文档的ID:基本上是一样的。

DECLARE @myDocId TABLE (yr int, no int)

INSERT INTO Documents
OUTPUT INSERTED.Year , INSERTED.YearID INTO @myDocID
...

SELECT TOP 1
CAST(yr AS NVARCHAR) +
'_' +
RIGHT(REPLICATE('0', 5) + CAST(no AS NVARCHAR), 5) AS NewID

关于asp.net - 在插入时获取下一个数字,在新的一年重置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com