SQL Server ->> 數據類型函數 DATALENGTH \IDENT_CURRENT \IDENT_INCR \IDENT_SEED \IDENTITY

DATALENGTH

返回傳入數據真實數據佔用子節(bytes)存儲大小。舉例,把 數值=1的整型傳入會得到4,因爲整型會佔用4個子節長度的數據存儲。而如果1是字符,返回1,如果1是unicode,返回2。講到DATALENGTH,自然會聯想到另外一個函數LEN。LEN只適用於字符,而DATALENGTH是多種數據類型都支持。LEN只關心字符的實際長度,不關係存儲空間。

SELECT DATALENGTH(N'1'),LEN(N'1'),DATALENGTH('1'),LEN('1'),DATALENGTH(1),LEN(1)

結果

 

 

 

IDENT_CURRENT

返回表當前的佔用掉的最大自增列的數值。如果返回NULL值,說明表從來沒有插入任何數據行或者表被截斷過。

講到IDENT_CURRENT就不得不講其他兩個同樣用於獲取自增值的函數:@@IDENTITY和SCOPE_IDENTITY

  • IDENT_CURRENT 返回爲某個會話和用域中的指定表生成的最新標識值。
  • @@IDENTITY 返回爲跨所有作用域的當前會話中的任何表生成的最後一個標識值。
  • SCOPE_IDENTITY 返回爲當前會話和當前作用域中的某個表生成的最新標識值。

意思就是IDENT_CURRENT返回的是指定表的最新標示值,至於標識值是否是已提交事務則不一定。SCOPE_IDENTITY則是當前會話作用域內產生的最新標示值,假設說有個會話,會話先插入數據到表A,調用了存儲過程A,存儲過程啥也沒幹,就輸出這個SCOPE_IDENTITY值,會得到表A的自增列值嗎? 答案是不會。SCOPE_IDENTITY的限制到當前作用域,如果當前作用域裏面沒有任何的數據插入,SCOPE_IDENTITY就不會產生任何值。

 

MSDN也提醒了“請謹慎使用 IDENT_CURRENT 來預測下一個生成的標識值。 由於其他會話執行的插入,實際生成的值可能與 IDENT_CURRENT 加上 IDENT_INCR 不同。”

因爲IDENT_CURRENT不同於SCOPE_IDENTITY。後者的前提是當前作用域(例如存儲過程)已經執行過數據插入到目標表,假設已經開啓事務,那麼SCOPE_IDENTITY緊隨在INSERT語句後面,這個時候INSERT語句發生的時候已經對錶申請了排他鎖,其他併發會話是需要等待當前事務提交才能執行數據插入,所以它獲取的SCOPE_IDENTITY值+1是可以預估下一行數據的自增列值的。而IDENT_CURRENT不是當前作用域級別,不會隨當前事務鎖定表,如果其他會話事務插入數據到表,不管事務是否提交,只要INSERT語句沒有被堵塞,意味着自增列值已經增加,所以IDENT_CURRENT+1有可能是錯誤的。

 

CREATE TABLE dbo.TEST_SCOPE_IDENTITY
(
    ID INT IDENTITY(1,1),
    COL1 NVARCHAR(50)
)


CREATE PROCEDURE dbo.sp_TEST_SCOPE_IDENTITY
AS 

SELECT SCOPE_IDENTITY()
GO
INSERT INTO  dbo.TEST_SCOPE_IDENTITY VALUES('')
SELECT SCOPE_IDENTITY()

EXEC sp_TEST_SCOPE_IDENTITY

 

 

 

 

IDENT_INCR 和 IDENT_SEED

IDENT_INCR返回表的自增列每次遞增的值,IDENT_SEED是表的自增列遞增起始種子,這個數值可以通過調用DBCC CHECKIDENT命令修改

 

IDENTITY

在select into 新表的時候可以自動創建自增列

--(1)  
SELECT IDENTITY(int, 1,1) AS ID_Num  
INTO NewTable  
FROM OldTable;  
  
--(2)  
SELECT ID_Num = IDENTITY(int, 1, 1)  
INTO NewTable  
FROM OldTable;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章