2016-08-18 79 views
0

我有一些代碼需要用戶標識和最後修改日期才能創建需要增量的序列。這並非總是如此,所以應該從這個腳本中發生的更新並不總是有效。SQL序列號失敗

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 

這個錯誤是我創建序列號的方式。我們需要使用上次修改日期來了解要更新哪個記錄,但是向其添加標識並不總是會創建更大的數字。所以我有時看到更新的序列號較低,最後一個序列號存儲在配置文件中,這是程序每次運行時從哪裏開始的信息。

實例序列號

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

以粗體顯示的數字會得到錯過了更新。

+0

您可以添加'rowversion'列:https://msdn.microsoft.com/en-us/library/ms182776.aspx – Blorgbeard

+0

與去即時通訊思想row_number() –

+0

我不認爲這就是你想要的 - 'row_number()'只是給結果集的每一行分配一個連續的數字。如果更新的字段不是按順序排列的,則不會爲該行獲取新的數字。如果有任何更改記錄的順序(例如中間插入),所有的數字都會改變。 – Blorgbeard

回答

0

可以

  • 轉換上次更改爲VARBINARY
  • 然後轉換爲VARCHAR
  • 提取物天,節拍與子()或左/右部分。我們需要它來改變天數/滴答的順序,因爲滴答先走,然後是天。
  • 然後轉換十六進制VARCHAR值(天+蜱)爲bigint
  • 乘以N(N是最大可能的學號)(處理場景中的多條記錄有相同的時間戳)
  • 最後加StudentID。這樣的數字將是唯一的和連續

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