[SQL Server]時間戳記。 timestamp與 rowversion資料型態

時間戳記。 timestamp與 rowversion資料型態

這是顯示在資料庫內自動產生的 "唯一"二進位數字(Byte[])的資料類型。rowversion通常用來做為版本戳記資料表資料列的機制。儲存體大小是 8 位元組。rowversion資料類型只是會遞增的數字,因此不會保留日期或時間。







[SQL Server]時間戳記。 timestamp與 rowversion資料型態

SQL 2005 -- timestamp
http://msdn.microsoft.com/zh-tw/library/ms182776(v=SQL.90).aspx

微軟的建議 -- timestamp 語法已被取代。未來的 Microsoft SQL Server 版本將移除這項功能。
                          請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。



SQL 2008起 -- rowversion
http://msdn.microsoft.com/zh-tw/library/ms182776(v=SQL.100).aspx

 

 


所謂的「時間戳記」,並 "不"是記錄一段日期與時間。

而是隨著時間變化,遞增這個時間戳記而已。
 

透過這個特性,

您在更新(Update)數據時,可以事先檢查這一筆記錄,
是否在您修改之前,已經被人更動過了。

 

在 SQL Server裡面查詢。
最後一個欄位就是採用 timestamp時間戳記

1    test111(修改後)           2011-04-26 14:42:00    0x000000000000DDEE
2    test222(修改後)          2011-04-23 00:00:00    0x000000000000DDE8
3    test333                             2011-04-24 00:00:00    0x000000000000DDE3
4    test444                              2011-04-25 00:00:00    0x000000000000DDE4
 

 

一旦您修改 (Update) 了某一列記錄(如:id=1這筆記錄)

時間戳記就會自動變成  0x000000000000DDE5 (......以此類推)
 


但是,程式無法把 timestamp呈現出來(直接呈現在畫面上)。

所以,您可能要採用這種兩方式稍作改寫:

======================================================================================

        Dim s As String = New UTF8Encoding().GetString(dr.GetSqlBinary(3).Value)
        Response.Write("test_timestamp(時間戳記) -- " & s & "<hr /><br />")
       '-- 這種字串,呈現在畫面上會變成亂碼。



======================================================================================
或是

(這段作法我試過,成功。但轉換出來的字串,跟原本資料表的 timestamp內容,有一點差異。)


        Dim SB As New StringBuilder()
        
        For i As Integer = 0 To (dr.GetSqlBinary(3).Length - 1)
            SB.Append(dr.GetSqlBinary(3).Item(i))
        Next
        
        Label1.Text = "test_timestamp(時間戳記) -- " & SB.ToString() & "<hr />"


        
        
 其中的 dr代表 DataReader
 dr.GetSqlBinary(3) 。   3代表第四個欄位(資料行 / Column)名稱     。

 這都是基礎 ADO.NET的用法。  
        

 

 

以下是微軟 MSDN網站的說明,寫得很詳細 (部分節錄如下)

這是顯示在資料庫內自動產生"唯一"二進位數字(Byte[])的資料類型。rowversion通常用來做為版本戳記資料表資料列的機制。儲存體大小是 8 位元組。rowversion資料類型只是會遞增的數字,因此不會保留日期或時間。若要記錄日期或時間,請使用 datetime2資料類型。

每個資料庫都有一個計數器,會針對在資料庫內包含 rowversion資料行的資料表所執行的每個插入或更新作業而累加。這個計數器是資料庫資料列版本。這會追蹤資料庫內的相對時間,而不是可關聯於時鐘的實際時間。資料表只能有一個 rowversion資料行。
每次修改或插入含 rowversion資料行的資料列時,都會在 rowversion資料行中插入累加的資料庫資料列版本值。

不可為 Null 的rowversion資料行,語意等於 binary(8) 資料行。
可為 Null 的 rowversion資料行,語意等於 varbinary(8)資料行。


如果您沒有指定資料行(欄位)名稱,Microsoft SQL Server 2005 Database Engine會產生 timestamp資料行名稱;不過,rowversion同義字不會遵照這個行為。

當您使用 rowversion時,您必須指定一個 [資料行(欄位)名稱]。

 

 

注意 !!   rowversion 欄位,  該欄位不建議成為索引鍵值

http://blogs.technet.com/b/technet_taiwan/archive/2015/01/16/tsql-series-0116.aspx

 

相關文章:

[MSDN] 如何寫出高效能 T-SQL

 

 

我將思想傳授他人, 他人之所得,亦無損於我之所有;

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson

線上課程教學,遠距教學 (Web Form 約51hr)  https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015

線上課程教學,遠距教學 (ASP.NET MVC 約75~88hr)  https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab

ASP.NET MVC線上課程 第一天 免費看 (5.5小時) 

寫信給我,不要私訊 --  mis2000lab (at) yahoo.com.台灣  或  school (at) mis2000lab.net


ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。 

................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................  YouTube (ASP.NET) 線上教學影片  https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/

 

Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download

請看我們的「售後服務」範圍(嚴格認定)

...................................................................................................................................................... 

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課

 

ASP.NET MVC 5 線上教學

         累積時數約 75~ 88小時...... 第一天(5.5小時)完整內容,"免費"讓您評估