在实际插入记录之前,您不应尝试像这样选择新的自定义 ID,因为其他人可能会在您之前插入相同的值。所以这里是你如何可能运行你的表格插入:
insert into John_IEP_Crossing_Dock_Shipment (MyCol1, MyCol2, ID)
select @MyFormValue1,
@MyFormValue2,
convert(varchar(10), current_timestamp, 20)
+ '-'
+ right('000' + cast(cast(right(coalesce(max(ID), '0'), 4) as smallint) + 1 as varchar(4)), 4)
from John_IEP_Crossing_Dock_Shipment
where ID like convert(varchar(10), current_timestamp, 20) + '%'; -- like may use an index in this case
我们在插入期间而不是之前提出 ID。这应该主要解决争用问题(哎呀,无论如何,您每天只能插入 9,999 个带有 4 位数 ID 后缀的插入),coalesce
并将处理您今天还没有数据的情况(并插入 ID“...- 0001”)。
如果您需要在插入后立即选择此记录以显示给用户,则可以使用output
关键字。
如果还没有,则必须向此 ID 列添加某种唯一约束。至少你可以处理异常并允许用户再次尝试插入,如果争用仍然是一个问题(我不够专业,可以说这些插入永远不会发生冲突,或者如果你应该锁定表以防止这样的事情发生)。
我同意@MartinSmith,我宁愿使用带有标识列(或者可能是 2012 年的序列)的创建日期列,从而能够计算这个 ID 列。我也明白应该只存储一些零件编号方案,有时跳过的数字无效(除非有删除)。
我欢迎那些了解更多的人提供反馈。