2012-04-19 47 views
3

我有一臺服務器和許多客戶,我的應用程序是在客戶端和數據庫服務器上,我有一個表插入並選擇不同的查詢SQL

Table --> Id --> int Auto-increment, 
Name --> nvarchar(50), 

所以,每當我插入新行從客戶端查詢

Insert into Table Name Values('NameValue') 

它插入行並且sql自動生成Id字段。所以,想要獲得它的ID號,我用下面的查詢

Select max(Id) as maxId from Table 

但兩者的查詢在不同的連接

它運作良好,當只有一臺客戶機同時工作,但是當多個客戶端的工作,在我可以請求'getMaxId'查詢之前,客戶端請求許多插入查詢。

+0

爲什麼所有的答案是如何獲得最後一個ID,如果我不是搞錯NEHA卡納,可以得到它,而且問題得到不正確ID – Likurg 2012-04-19 08:44:58

+0

可以聊天你的問題? – Likurg 2012-04-19 08:53:10

回答

1

而是使用:的

select @@identity 

代替select max(id)...

它將返回最後生成的標識當前連接。

+2

使用@@標識時需要小心。由於它跨範圍,你可以從觸發器中獲得一個值,而不是你當前的語句 - http://stackoverflow.com/a/42655/905651 – weenoid 2012-04-19 08:43:35

+0

但是對於每個sql qery,我都建立一個新的連接 – 2012-04-19 08:46:49

2

您可以使用以下方法:

SELECT SCOPE_IDENTITY() 

這將選擇最後插入的標識。

2

試試這個:

DECLARE @a TABLE (
    Id int IDENTITY (1, 1), 
    b VARCHAR(1000) 
) 

DECLARE @b TABLE (
    Id INT 
) 

INSERT @a (b) 
OUTPUT INSERTED.Id INTO @b 
SELECT NAME 
FROM sys.objects 


SELECT * FROM @a 
SELECT * FROM @b 

或者,你可以隨時使用檢索最新的ident:

SELECT IDENT_CURRENT('TABLE_NAME') 

或者使用

SELECT SCOPE_IDENTITY() 
+0

請檢查更新,它可以是sipmler,但可以解決您的問題 – 2012-04-19 08:39:30

2

的最好方法是運行命令獲取最近插入的值。

有三個命令可以運行。

This鏈接將解釋他們

最好是

SELECT SCOPE_IDENTITY() 

因爲如果你有一個調用觸發,這觸發插入數據的表B中的表上,這個命令將讓你的表A的ID,而@@ IDENTITY會得到表B的ID

+0

請參閱我的編輯並研究@@ IDENTITY和SCOPE_IDENTITY()之間的差異。這個非常重要 – Diego 2012-04-19 08:42:25

0

插入後添加以下內容,而不是最大(id)選擇。

SELECT SCOPE_IDENTITY() 
1

利用這一點,但它適用於PHP

的$ id = mysql_insert_id();

和C#

的Int32 NEWID =(Int32)已myCommand.ExecuteScalar();

0

在sql中創建函數,您將在其中添加行並通過SELECT SCOPE_IDENTITY()獲取ID。當您調用函數時,您將獲得剛剛添加的ID。

0

試試這個希望這將有助於您

declare @table1 table(id int identity,name varchar(50)) 
    insert into @table1 (name) output inserted.id values('abc') 
    insert into @table1 (name) output inserted.id values('xyz') 
    insert into @table1 (name) output inserted.id values('pqr') 

for more see here