1

当我运行此查询时,它返回 ID 的空值。该代码应该在 id 列中获取最大值。

2013-06-13-0001
2013-06-13-0002

它应该获得 id 列的2013-06-13-0002(因为它0002的值大于0001)。查询应该获得最大 id 并向其添加 1。

SELECT 
   ID = LEFT(max(ID), 10) + '-' + 
        RIGHT('000' + CONVERT(VARCHAR, CONVERT(INT, RIGHT(max(ID), 4)) + 1), 4)
FROM John_IEP_Crossing_Dock_Shipment
WHERE
   LEFT(ID, 10) = CONVERT(VARCHAR(10), Getdate(), 20) 
4

1 回答 1

1

在实际插入记录之前,您不应尝试像这样选择新的自定义 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 列。我也明白应该只存储一些零件编号方案,有时跳过的数字无效(除非有删除)。

我欢迎那些了解更多的人提供反馈。

于 2013-06-14T21:13:57.660 回答