当我运行此查询时,它返回ID的空值。代码应该在id列中获取最大值。
2013-06-13-0001
2013-06-13-0002
它应该得到2013-06-13-0002
(因为0002
比0001
的值更大,因为id列...查询应该获得最大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)
答案 0 :(得分: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,而不是之前。这应该主要解决争用问题(哎呀,你每天只能使用4位ID后缀9,999次插入)而coalesce
将处理你今天没有数据的情况(并插入ID) ” ...- 0001" )。
如果您需要在插入后立即选择此记录以向用户显示,则可以使用output
关键字。
如果它还没有,则必须向此ID列添加某种唯一约束。至少那时你可以处理异常,并允许用户再次尝试插入,如果争用仍然是一个问题(我不够专业,说这些插入永远不会碰撞或你应该锁定表格可以防止这样的事情。)
我同意@MartinSmith,我宁愿使用带有标识列的创建日期列(或者可能是2012 sequence),因此可以计算此ID列。我也明白应该存储一些部件编号方案,有时跳过的数字无效(除非有删除)。
我欢迎那些了解更多的人的反馈。