SQL查询返回null?

时间:2013-06-14 19:39:12

标签: sql sql-server sql-server-2012

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

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

它应该得到2013-06-13-0002(因为00020001的值更大,因为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) 

1 个答案:

答案 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列。我也明白应该存储一些部件编号方案,有时跳过的数字无效(除非有删除)。

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