我试图更新sql server表中用于生成ID的列:表结构是这样的
名称varchar(50),LastID长
在最后一个ID中,我们保留了我们为StudentID生成的Last ID。所以数据看起来像这样
Name :Student, LastID : 50001
最后一个ID递增1以生成(主键)的唯一ID。
现在有一种情况,我们必须在它到达Max(比如100000)时将此LastID重置为0。所以我正在使用
Update Sequence
set LastID = Case when LastID + @range >= @max then 0 else LastID end
where Name ='StudentID'
范围是我们传递给存储过程的参数,通常在我的情况下它是100。因此,在设置LastID之前,我会检查它是否超过学生ID的Max,即1,00,000。
在上面的更新查询中困扰我的是我再次将LastID更新为它的当前值,如果它没有超出范围。寻找更好的选择。我不想做的是:
使用select并将LastID保存在变量或类似的东西中。
如果可能的话,我只想在一次更新中做。
这是一个sql server 2008数据库,所以我不能使用sql server 2012的内置序列功能。
如果需要更多信息,请告诉我。
如果你真的想用你的sql代码,你可以尝试
Update Sequence
set LastID = Case when LastID + @range >= @max then 0 else LastID end
FROM Sequence
where Name ='StudentID'
有关如何使用此语法的更多信息,请参阅How do I UPDATE from a SELECT in SQL Server?
此外,我不建议在您的情况下使用不同的方法,因为您不希望在LastID不符合条件时更新值,因此cf_en建议在where子句中过滤这些值,然后仅更新其余值
Update Sequence
set LastID = 0
FROM Sequence
where Name ='StudentID' and LastID + @range >= @max
此查询将更快,因为它不会更新db中具有相同值的所有行