SQL序列号失败

时间:2016-08-18 02:23:12

标签: sql sql-server

我有一些代码使用用户ID和上次修改日期来创建需要增量的序列。情况并非总是如此,因此应该从此脚本发生的更新并不总是有效。

DECLARE @SequenceNumber BIGINT
SET @SequenceNumber = 0

SELECT  
    [Student_ID] as IDCode,
    [Last_modified] as LastModified,
    CONVERT(BIGINT, CONVERT(VARCHAR(MAX), CAST(FLOOR(CAST([Last_modified] AS FLOAT)) AS BIGINT) * 1000000 + DATEPART(hour, [Last_modified]) * 10000 + DATEPART(minute, [Last_modified]) * 100 + DATEPART(second,[Last_modified])) + CONVERT(VARCHAR(MAX), RIGHT('00000' + RTRIM([Student_ID]), 5))) AS SequenceNumber
FROM 
    [CardDB].[dbo].[Card]
WHERE
    convert(bigint,convert(varchar(max),cast(floor(cast([Last_modified] as float)) as bigint)*1000000 + DATEPART(hour,[Last_modified]) * 10000 + DATEPART(minute,[Last_modified]) * 100 + DATEPART(second,[Last_modified]))+convert(varchar(max), RIGHT('00000'+ rtrim([Student_ID]),5))) > @SequenceNumber
ORDER by 
    SequenceNumber ASC

错误是我创建序列号的方式。我们需要使用上次修改日期来知道要更新哪条记录,但是为此添加id并不总是会创建更大的数字。所以我有时看到的是序列号较低的更新,最后的序列号存储在配置文件中,这是程序用来知道每次运行时从哪里开始的。

序列号示例

4246610134504882  
4246610134504827  
4246610134504805  
4246610134504406   **  
4246610134503828   **
4246610134502560   **
4246610134502402   **
4246610134502383   **
4246610134504422  

以粗体显示的数字将错过更新。

1 个答案:

答案 0 :(得分:0)

你可以

  • 将LastModified转换为varbinary
  • 然后到varchar
  • 使用substring()或Left / Right提取days和ticks部分。我们需要它来改变天数/刻度的顺序,因为刻度先行,然后是天。
  • 然后将hex varchar值(天+刻度)转换为bigint
  • 乘以N(其中N是可能的最大学生ID)(以处理多个记录具有相同时间戳的情况)
  • 最后添加StudentID。这样的号码将是唯一的和顺序的

http://weblogs.sqlteam.com/peterl/archive/2010/12/15/the-internal-storage-of-a-datetime2-value.aspx