国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
如何在Sql Server中準(zhǔn)確的獲得標(biāo)識值 _ 編程_數(shù)據(jù)庫_C語言_電腦技術(shù)_程序設(shè)計...

如何在Sql Server中準(zhǔn)確的獲得標(biāo)識值

如何在Sql Server中準(zhǔn)確的獲得標(biāo)識值(2)

SQL SERVER 2000 中的標(biāo)識值獲取函數(shù)

 
摘要: SQL Server有三種不同的函數(shù)可以用來獲得含有標(biāo)識列的表里最后生成的標(biāo)識值: @@IDENTITY SCOPE_IDENTITY() IDENT_CURRENT('數(shù)據(jù)表名') 以上三個函數(shù)雖然都可以返回數(shù)據(jù)庫引擎最后生成插入標(biāo)識列的值,但是根據(jù)插入行的來源(例如:存儲過程或觸發(fā)器)以及插入

SQL Server有三種不同的函數(shù)可以用來獲得含有標(biāo)識列的表里最后生成的標(biāo)識值:

IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!



  @@IDENTITY
  SCOPE_IDENTITY()
  IDENT_CURRENT('數(shù)據(jù)表名') IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!


  以上三個函數(shù)雖然都可以返回數(shù)據(jù)庫引擎最后生成插入標(biāo)識列的值,但是根據(jù)插入行的來源(例如:存儲過程或觸發(fā)器)以及插入該行的連接不同,這三個函數(shù)在功能上也有所不同。 內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn

  @@IDENTITY函數(shù)可以返回所有范圍內(nèi)當(dāng)前連接插入最后所生成的標(biāo)識值(包括任何調(diào)用的存儲過程和觸發(fā)器)。這個函數(shù)不止可以適用于表。函數(shù)返回的值是最后表插入行生成的標(biāo)識值。

copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  SCOPE_IDENTITY()函數(shù)跟上一個函數(shù)幾乎是一摸一樣的,不同的地方:即前者返回的值只限于當(dāng)前范圍(即執(zhí)行中的存儲過程)。 IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!

  最后是IDENT_CURRENT函數(shù),它可以用于所有范圍和所有連接,獲得最后生成的表標(biāo)識值。跟前面兩個函數(shù)不同的是,這個函數(shù)只用于表,并且使用[數(shù)據(jù)表名]作為一個參數(shù)。 www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  我們可以舉實例來演示上述函數(shù)是如何運作的。

www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  首先,我們創(chuàng)建兩個簡單的例表:一個代表客戶表,一個代表審計表。創(chuàng)建審計表的目的是為了跟蹤數(shù)據(jù)庫里插入和刪除信息的所有記錄。 內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn

  以下是引用片段: copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)


  CREATE TABLE dbo.customer
  (customerid INT IDENTITY(1,1) PRIMARY KEY)
  GO
  CREATE TABLE dbo.auditlog
  (auditlogid INT IDENTITY(1,1) PRIMARY KEY,
  customerid INT, action CHAR(1),
  changedate datetime DEFAULT GETDATE())
  GO

內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn


  然后,我們還要創(chuàng)建一個存儲過程和一個輔助觸發(fā)器,這個存儲過程將在數(shù)據(jù)庫表里插入新的客戶行,并返回生成的標(biāo)識值,而觸發(fā)器則會向?qū)徲嫳聿迦胄校?內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn

  以下是引用片段:

本文來自IT學(xué)習(xí)網(wǎng)本文來自www.it521.com.cn


  CREATE PROCEDURE dbo.p_InsertCustomer @customerid INT output
  AS
  SET nocount ON
  INSERT INTO dbo.customer DEFAULT VALUES
  SELECT @customerid = @@identity
  GO
  CREATE TRIGGER dbo.tr_customer_log ON dbo.customer
  FOR INSERT, DELETE
  AS
  IF EXISTS (SELECT 'x' FROM inserted)
  INSERT INTO dbo.auditlog (customerid, action)
  SELECT customerid, 'I'
  FROM inserted
  ELSE
  IF EXISTS (SELECT 'x' FROM deleted)
  INSERT INTO dbo.auditlog (customerid, action)
  SELECT customerid, 'D'
  FROM deleted
  GO www.it521.com.cnIT學(xué)習(xí)網(wǎng)

現(xiàn)在我們可以執(zhí)行程序,創(chuàng)建客戶表的第一行了: IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!

  以下是引用片段: www.it521.com.cnIT學(xué)習(xí)網(wǎng)


  DECLARE @customerid INT
  EXEC dbo.p_InsertCustomer @customerid output
  SELECT @customerid AS customerid

IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!


  執(zhí)行后返回了我們需要的第一個客戶的值,并記錄了插入審計表的條目。到目前為止,數(shù)據(jù)顯示沒有任何問題。

內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn

  假設(shè)由于先前溝通出現(xiàn)了偏差,一個客戶服務(wù)代表現(xiàn)在需要從數(shù)據(jù)庫里刪除掉這個新增的客戶。我們現(xiàn)在就來把新插入的客戶行刪除掉: 內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn

  以下是引用片段:

www.it521.com.cnIT學(xué)習(xí)網(wǎng)


  DELETE FROM dbo.customer WHERE customerid = 1

本文來自IT學(xué)習(xí)網(wǎng)本文來自www.it521.com.cn


  現(xiàn)在,客戶工作表為空表,而審計工作表里則有兩行——第一行是記錄第一次插入行,第二行是記錄刪除客戶記錄。 IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!

  現(xiàn)在我們再往數(shù)據(jù)庫里增加第二個客戶信息并檢測一下獲得的標(biāo)識值:

IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!

  以下是引用片段:

內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn


  DECLARE @customerid INT
  EXEC dbo.p_InsertCustomer @customerid output
  SELECT @customerid AS customerid

IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!


  哇!看看出現(xiàn)了什么情況!如果我們現(xiàn)在再看客戶工作表,就會發(fā)現(xiàn)雖然創(chuàng)建了客戶2,但是我們的程序返回的標(biāo)識值為3!到底出了什么問題呢?回想一下,前面講過@@IDENTITY函數(shù)的作用范圍,它會返回主程序調(diào)用的任何存儲過程或觸動任何觸發(fā)器最后生成的標(biāo)識值,取決于哪一個在函數(shù)被調(diào)用前最后生成標(biāo)識值。在我們的例子里,初始范圍是p_InsertCustomer,然后是觸發(fā)器用來記錄插入條目的tr_customer_log。因此我們返回獲得的標(biāo)識值是審計工作表里觸發(fā)器插入生成的標(biāo)識值,而不是我們想要的客戶工作表里的生成的標(biāo)識值。 copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  在SQL Server 2000之前的版本,@@IDENTITY函數(shù)是獲得標(biāo)識值的唯一方法。由于會出現(xiàn)這樣的存儲過程/觸發(fā)器問題,SQL Server開發(fā)團(tuán)隊在SQL Server 2000中引入了 SCOPE_IDENTITY()和IDENT_CURRENT這兩個函數(shù)來解決這個問題。所以在舊的SQL Server版本里,要解決這個問題比較麻煩。如果是SQL Server6.5版本,我建議可以去掉標(biāo)識列,然后創(chuàng)建一個可以包含下一個需要使用的值的輔助表,可以達(dá)到標(biāo)識列的作用效果。不過這個辦法也不是什么高明的辦法。

內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn

  現(xiàn)在我們來修改一下存儲過程來使用SCOPE_IDENTITY()函數(shù),并重新執(zhí)行程序來添加第三個客戶條目:
以下是引用片段: copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)


  ALTER PROCEDURE dbo.p_InsertCustomer @customerid INT output
  AS
  SET nocount ON
  INSERT INTO dbo.customer DEFAULT VALUES
  SELECT @customerid = SCOPE_IDENTITY()
  GO
  DECLARE @customerid INT
  EXEC dbo.p_InsertCustomer @customerid output
  SELECT @customerid AS customerid

copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)


  我們返回的標(biāo)識值還是3,不過這次我們獲得的標(biāo)識值是正確的,因為我們添加了第三個客戶條目。如果我們檢查一下審計工作表,就會發(fā)現(xiàn)里面已經(jīng)有第四個條目記錄新插入的客戶記錄。由于函數(shù)SCOPE_IDENTITY()只作用于當(dāng)前范圍,只返回當(dāng)前執(zhí)行程序的值,這樣就避免了發(fā)生剛才那樣的問題。 copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  前面講過,函數(shù)@@IDENTITY和函數(shù)SCOPE_IDENTITY()不止用于表,不像函數(shù)IDENT_CURRENT那樣可以用表作為參數(shù)。使用@@IDENTITY和SCOPE_IDENTITY()這兩個函數(shù)的話在設(shè)置代碼時需要加倍小心,才能夠從所需要的表里獲得正確的標(biāo)識值。從表面上來看,放棄這兩個函數(shù),只使用函數(shù)IDENT_CURRENT并指定表是更安全的辦法。這樣可以避免出現(xiàn)獲得錯誤標(biāo)識值的情況,對吧?記得先前說過函數(shù)IDENT_CURRENT不僅會跨范圍,而且它還會跨連接。也就是說,使用這個函數(shù)生成的值不僅僅限于你的連接所執(zhí)行的程序,它的涵蓋范圍還包括整個數(shù)據(jù)庫所有的連接。因此,即使是在規(guī)模較小的OLTP環(huán)境里,它也會出現(xiàn)不能準(zhǔn)確返回所需值的問題。這樣就可能發(fā)生類似前面@@IDENTITY函數(shù)/觸發(fā)器的數(shù)據(jù)損壞問題。
 
 

如何在Sql Server中準(zhǔn)確的獲得標(biāo)識值(2)

摘要: 我的建議是函數(shù)SCOPE_IDENTITY()是三個函數(shù)里最安全的函數(shù),應(yīng)該設(shè)置為默認(rèn)函數(shù)。使用這個函數(shù),你可以放心地添加觸發(fā)器和次存儲過程,無需擔(dān)心意外損壞數(shù)據(jù)。而另外兩個函數(shù)可以保留應(yīng)付特殊的情況,當(dāng)遇到需要使

  我的建議是函數(shù)SCOPE_IDENTITY()是三個函數(shù)里最安全的函數(shù),應(yīng)該設(shè)置為默認(rèn)函數(shù)。使用這個函數(shù),你可以放心地添加觸發(fā)器和次存儲過程,無需擔(dān)心意外損壞數(shù)據(jù)。而另外兩個函數(shù)可以保留應(yīng)付特殊的情況,當(dāng)遇到需要使用這兩個函數(shù)的特殊情況時,建議記錄它們的使用情況并進(jìn)行測試。 copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  小技巧:

內(nèi)容來自IT學(xué)習(xí)網(wǎng)www.it521.com.cn

  Sql Server 判斷表是存在標(biāo)識列 www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  If Exists(Select * from SysColumns Where ID=OBJECT_ID(N'TEST1') And COLUMNPROPERTY(ID,Name,'IsIdentity')=1)

copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  Print N'有自增列'

www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  Else copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  Print N'沒有自增列'

IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!

  Sql Server 顯示當(dāng)前數(shù)據(jù)庫包含自增列的表 copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  Select b.name,a.* from SysColumns a,sysobjects b Where a.id=b.id and COLUMNPROPERTY(a.ID,a.Name,'IsIdentity')=1 copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  SQL SERVER自增張字段復(fù)位方法:

www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  SQLSERVER 復(fù)位:

copyright www.it521.com.cnIT學(xué)習(xí)網(wǎng)

  Truncate table Ashare_CJHB IT學(xué)習(xí)網(wǎng),全國最大的IT在線學(xué)習(xí)網(wǎng)站!

  Dbcc checkident (Ashare_CJHB,RESEED,0)
 
 

SQL SERVER 2000 中的標(biāo)識值獲取函數(shù)

SQL SERVER 2000 中的標(biāo)識值獲取函數(shù)
    IDENTITY(標(biāo)識)列,也有很多人稱之為自增列,在SQL Server 2000中,標(biāo)識列通過IDENTITY來定義,下面是與獲取最后插入記錄的標(biāo)識值有關(guān)的函數(shù)的一個示例說明
    SQL Server 中,可以使用 SCOPE_IDENTITY()、 @@IDENTITY 、 IDENT_CURRENT() 來取得最后插入記錄的值值,它們的區(qū)別在于:
    SCOPE_IDENTITY() 返回插入到同一作用域中的 IDENTITY 列內(nèi)的最后一個 IDENTITY 值。一個作用域就是一個模塊——存儲過程、觸發(fā)器、函數(shù)或批處理。因此,如果兩個語句處于同一個存儲過程、函數(shù)或批處理中,則它們位于相同的作用域中。
    @@IDENTITY       返回在當(dāng)前會話的所有表中生成的最后一個標(biāo)識值
    IDENT_CURRENT()  返回為任何會話和任何作用域中的指定表最后生成的標(biāo)識值
    下面以一個示例來說明它們的區(qū)別
    -- a) 示例代碼
    -- ===========================================
    -- 創(chuàng)建測試表
    -- ===========================================
    USE tempdb
    GO
    CREATE TABLE t1(id int IDENTITY,col int)
    INSERT t1 SELECT 1
    UNION ALL SELECT 2
    CREATE TABLE t2(id int IDENTITY,col int)
    GO
    CREATE TRIGGER TR_insert_t2 ON t2
    FOR INSERT
    AS
    INSERT t1 SELECT 3
    GO
    -- ===========================================
    -- 測試三個函數(shù)..1
    -- ===========================================
    INSERT t2 VALUES(1)
    SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
    [@@IDENTITY]=@@IDENTITY,
    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N''t1''),
    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N''t2'')

    /*--結(jié)果
    SCOPE_IDENTITY()   @@IDENTITY   IDENT_CURRENT() For t1     IDENT_CURRENT() For t2                  
    ------------------ ------------ -------------------------- -----------------------
    1                  3            3                          1

    (所影響的行數(shù)為 1 行)
    --*/
    GO
    -- ===========================================
    -- 測試三個函數(shù)..2
    -- ===========================================
    INSERT t1 VALUES(10)
    SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
    [@@IDENTITY]=@@IDENTITY,
    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N''t1''),
    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N''t2'')
    /*--結(jié)果
    SCOPE_IDENTITY()   @@IDENTITY   IDENT_CURRENT() For t1     IDENT_CURRENT() For t2                  
    ------------------ ------------ -------------------------- -----------------------
    4                  4            4                          1
    (所影響的行數(shù)為 1 行)
    --*/
    GO
    -- ===========================================
    -- 測試三個函數(shù)..3
    -- ** 開啟一個新連接,執(zhí)行下面的代碼 **
    -- ===========================================
    SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),
    [@@IDENTITY]=@@IDENTITY,
    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N''t1''),
    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N''t2'')
    /*--結(jié)果
    SCOPE_IDENTITY()   @@IDENTITY   IDENT_CURRENT() For t1     IDENT_CURRENT() For t2                  
    ------------------ ------------ -------------------------- -----------------------
    NULL               NULL         4                         &n
    --===========================================
    -- 刪除測試環(huán)境
    -- ===========================================
    DROP TABLE t1,t2
    -- b) 代碼結(jié)果說明
    從上面的代碼可以看到:
    IDENT_CURRENT()  始終返回指定表最后插入的標(biāo)識值
    @@IDENTITY       返回當(dāng)前會話的標(biāo)識值,無論是否在同一個作用域,在測試1、2中,可以看到它返回的是觸發(fā)器中插入記錄的標(biāo)識值,而在測試3中,因為當(dāng)前會話無插入記錄,所以返回NULL
    SCOPE_IDENTITY() 返回當(dāng)前會話同一作用域的標(biāo)識值,所以在測試1、2中,它返回的值不受觸發(fā)器的影響,而在測試3中,因為當(dāng)前會話無插入記錄,所以返回NULL

 
 
 
 
 
 
 

 
 
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
sql server獲取自增值的方法
深入淺出SQL Server 2008 分區(qū)函數(shù)和分區(qū)表
30 分鐘快快樂樂學(xué) SQL Performance Tuning
【個人學(xué)習(xí)2之-與字符相關(guān)的問題】
SQL Server解惑——標(biāo)識列的限制和跳號現(xiàn)象
保存一個記錄到數(shù)據(jù)庫又馬上返回ID號
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服