程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 應用SQL Server 獲得拔出記載後的ID(主動編號)

應用SQL Server 獲得拔出記載後的ID(主動編號)

編輯:MSSQL

應用SQL Server 獲得拔出記載後的ID(主動編號)。本站提示廣大學習愛好者:(應用SQL Server 獲得拔出記載後的ID(主動編號))文章只能為提供參考,不一定能成為您想要的結果。以下是應用SQL Server 獲得拔出記載後的ID(主動編號)正文


比來在開辟項目標進程中碰到一個成績,就是在拔出一筆記錄的後要立刻獲得地點數據庫中ID,而該ID是自增的,怎樣做?在sql server 2005中有幾種方法可以完成。
要獲得此ID,最簡略的辦法就是在查詢以後select @@indentity
--SQL語句創立數據庫和表

create database dbdemo
go
use dbdemo
go
create table tbldemo
(
    id int primary key identity(1,1),
    name varchar(20)
)
go

--履行上面SQL語句就可以查出來剛拔出記載對應的自增列的值
insert into tbldemo values('測試') select @@identity
SQL Server 2000中,有三個比擬相似的功效:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它們都前往拔出到 IDENTITY 列中的值。

  1)IDENT_CURRENT 前往為任何會話和任何感化域中的特定表最初生成的標識值,它不受感化域和會話的限制,而受限於所指定的表。
  2)@@IDENTITY前往為以後會話的一切感化域中的任何表最初生成的標識值。
  3) SCOPE_IDENTITY 前往為以後會話和以後感化域中的任何表最初生成的標識值。

SCOPE_IDENTITY 和 @@IDENTITY 前往在以後會話中的任何表內所生成的最初一個標識值。然則,SCOPE_IDENTITY 只前往拔出到以後感化域中的值;@@IDENTITY 不受限於特定的感化域。
例如,有兩個表 T1 和 T2,在 T1 上界說了一個 INSERT 觸發器。當將某行拔出 T1 時,觸發器被激起,並在 T2 中拔出一行。此例解釋了兩個感化域:一個是在 T1 上的拔出,另外一個是作為觸發器的成果在 T2 上的拔出。

假定 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 將在 T1 上的 INSERT 語句的最初前往分歧的值。@@IDENTITY 前往拔出到以後會話中任何感化域內的最初一個 IDENTITY 列值,該值是拔出 T2 中的值。

SQL Server 前往最初拔出記載的主動編號ID
比來在開辟項目標進程中碰到這麼一個成績,就是在拔出一筆記錄的後立刻獲得其在數據庫中自增的ID,以便處置相干聯的數據,怎樣做?在sql server 2000中可以如許做,有幾種方法。具體請看上面的講授與比較。

1、要獲得此ID,最簡略的辦法就是:(以下舉一簡略適用的例子)

--創立數據庫和表

create database MyDataBase
use MyDataBase
create table mytable
(
id int identity(1,1),
name varchar(20)
)
--履行這個SQL,就可以查出來剛拔出記載對應的自增列的值
insert into mytable values('李四')
select @@identity

2、三種方法的比擬

SQL Server 2000中,有三個比擬相似的功效:他們分離是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它們都前往拔出到 IDENTITY 列中的值。
IDENT_CURRENT 前往為任何會話和任何感化域中的特定表最初生成的標識值。IDENT_CURRENT 不受感化域和會話的限制,而受限於指定的表。IDENT_CURRENT 前往為任何會話和感化域中的特定表所生成的值。
@@IDENTITY 前往為以後會話的一切感化域中的任何表最初生成的標識值。
SCOPE_IDENTITY 前往為以後會話和以後感化域中的任何表最初生成的標識值
SCOPE_IDENTITY 和 @@IDENTITY 前往在以後會話中的任何表內所生成的最初一個標識值。然則,SCOPE_IDENTITY 只前往拔出到以後感化域中的值;@@IDENTITY 不受限於特定的感化域。

例如,有兩個表 T1 和 T2,在 T1 上界說了一個 INSERT 觸發器。當將某行拔出 T1 時,觸發器被激起,並在 T2 中拔出一行。此例解釋了兩個感化域:一個是在 T1 上的拔出,另外一個是作為觸發器的成果在 T2 上的拔出。

假定 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 將在 T1 上的 INSERT 語句的最初前往分歧的值。

@@IDENTITY 前往拔出到以後會話中任何感化域內的最初一個 IDENTITY 列值,該值是拔出 T2 中的值。

SCOPE_IDENTITY() 前往拔出 T1 中的 IDENTITY 值,該值是產生在雷同感化域中的最初一個 INSERT。假如在感化域中產生拔出語句到標識列之前叫醒挪用 SCOPE_IDENTITY() 函數,則該函數將前往 NULL 值。

而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 前往的值分離是這兩個表最初自增的值。

ajqc的試驗:(40條當地線程,40+40條長途線程同時並發測試,拔出1200W行),得出的結論是:

1.在典范的級聯運用中.不克不及用@@IDENTITY,在CII850,256M SD的機械上1W多行時就會並發抵觸.在P42.8C,512M DDR上,才6000多行時就並發抵觸.
2.SCOPE_IDENTITY()是相對靠得住的,可以用在存儲進程中,連觸發器也不消建,沒並發抵觸
SELECT   IDENT_CURRENT('TableName')   --前往指定表中生成的最初一個標示值  
SELECT   IDENT_INCR('TableName')--前往指定表的標示字段增量值
SELECT   IDENT_SEED('TableName')--前往指定表的標示字段種子值

前往最初拔出記載的主動編號

SELECT IDENT_CURRENT('TableName')
前往下一個主動編號:  
SELECT   IDENT_CURRENT('TableName')   +   (SELECT   IDENT_INCR('TableName'))
SELECT @@IDENTITY --前往以後會話一切表中生成的最初一個標示值

以上是針對sql server 2000的情形,然則諸如my sql或oracle中若何完成呢?怎樣處置呢?自己也在探索中。。。。若有同伙曉得此處置方法,別忘了告之,一同分享!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved