2012-09-25 41 views
0

我的問題是如果我有兩個並行的批量插入到一個表中,SQL Server如何創建標識值?SQL Server如何在標識列中生成值?

我的意思是,如果在一個會話中插入多行(Row1-Row2-Row3),同時另一個會話同時插入多行(Row4-Row5-Row6),結果會是這樣嗎?

Row1 
Row2 
Row3 
Row4 
Row5 
Row6 

或者類似的東西?

Row1 
Row6 
Row3 
Row5 
Row4 
Row2 

回答

7

您正在制定假設表中的一個命令的常見謬誤。表格沒有順序。只有結果有順序,除非指定了明確的ORDER BY,否則該順序是未確定的。

您可能會問一個不同的問題:在併發插入的情況下,如何分配標識生成的值?答案很簡單:沒關係。如果你對訂單做出任何假設,那麼你的代碼就會被破壞。差距也是如此。即使生成的身份完全是隨機的,您的應用程序也應該可以正常工作,如果身份完全是隨機的,則正確編寫的應用程序將會工作。使用SCOPE_IDENTITY()檢索上次插入的標識。更好的是,使用INSERTOUTPUT子句,它也適用於多行插入。

備案:身份按照操作獲得對log stream的訪問的順序生成。

+0

+1好說! :-) –

+0

感謝replay.I使用SCOPE_IDENTITY()但我想知道我可以確定,在批量插入我的previes身份是SCOPE_IDENTITY() - 1或不? – vesna

+0

是一個糟糕的假設。正如我所說的,對多行插入使用OUTPUT子句。 –