2012-06-21 96 views
1

早上好。我有兩張桌子,一張是另一張。當我插入到主表中時,主鍵是自動生成的,即標識字段。我需要將這個值插入到第二個表中。將標識列值插入另一個表中

我發現使用OUTPUT子句會給我剛纔插入的身份值,所以我試了這個。

insert into owners (pId) 
    insert into personal (firstName) 
    output inserted.pId 
    values ('fn') 

雖然不起作用。我得到一個錯誤:

Incorrect syntax near the keyword 'insert'

個人表是主表,所有者表包含外鍵。 如何在SQL Server中執行所需的操作?

我卡住了,在這裏對過去兩天...

+0

你可以發佈這兩個表的結構嗎? –

+0

你想讓我發佈整個結構,還是隻有相應的字段? –

回答

3

嘗試以下步驟

1)上的插入

2應用事務級別)獲取上次使用SCOPE_IDENTITY()函數插入ID。

當您應用事務級別時,它將鎖定您的表,並且其他/同一用戶此時無法插入值。

試試這個,它會爲你工作。

+0

你可以解釋事務級別?我相信我明確地鎖定了這些故事,但我想知道這是否容易出錯...... –

+0

當您應用事務級別時,它會鎖定您在此事務中使用的表,並在完成後釋放表鎖交易。在事務期間,其他請求將由Sql服務器排隊,並且在完成此事務之後,其他請求將完成。 我建議你必須使用事務級別,即Begin Trans .......在代碼中提交Trans,這將避免任何其他用戶在同一時間執行插入。謝謝 – Asif

+0

交易是否確實鎖定了涉及的表格?我的意思是,不會是一個真正的性能瓶頸? –

2

可以使用SCOPE_IDENTITY()函數返回插入的標識值。

DECLARE @id INT 
INSERT INTO [Personal] (Colums ....) VALUES (this, that, stuff) 
SET @id = SCOPE_IDENTITY() 

INSERT INTO [Owners] (Colums ....) VALUES (@id ....) 
+0

我知道SCOPE_IDENTITY給出了給定範圍內的最後插入的標識,但不一定在給定的表上......應用程序託管在網絡上,並且多個用戶的行爲不會給我準確的結果。例如,在我更新表**個人**之後,其他/相同的用戶可以在插入到**所有者**之前更新其他表。然後,SCOPE_IDENTITY將給我最新的身份值,但不會從個人表中。 還是我錯了? –

+0

對不起,我不確定我是否理解你在說什麼,你能澄清你的問題嗎? – Kane

+0

不同的用戶有不同的範圍。所以SCOPE_IDENTITY()將從同一範圍返回標識。你永遠不會有這種衝突,你提到 – Rab

2

我覺得你的選擇是使用SCOPE_IDENTITY()但對方最接近你的選擇是IDENT_CURRENT(‘tablename’),所以我想,我張貼的其他身份選項的詳細細節,以及它可能會幫助你瞭解你的選擇和力量有幫助其他時間

@@IDENTITY It returns the last IDENTITY value produced on a connection, regardless of the table that produced the value, and regardless of the scope of the statement that produced the value.


SCOPE_IDENTITY() It returns the last IDENTITY value produced on a connection and by a statement in the same scope, regardless of the table that produced the value.


IDENT_CURRENT(‘tablename’) It returns the last IDENTITY value produced in a table, regardless of the connection that created the value, and regardless of the scope of the statement that produced the value.

+0

我認爲所有三個都不會做...問題是,多個用戶將從不同的範圍工作在不同的表上。我需要找到我剛插入的給定元組的標識值。請注意** I **和**給出的元組**。我的意思是我不能從其他表的結果或範圍干擾... –

3

由於OUTPUT條款不能直接使用,因爲外鍵,您可以添加生成的ID到一個臨時表,然後將這些值到owners表:

BEGIN TRANSACTION 

CREATE TABLE #ids(ID INT) 
INSERT INTO personal(firstName) 
    OUTPUT inserted.pid INTO #ids 
    SELECT 'A' 
    UNION SELECT 'B' 

INSERT INTO owners(pid) 
    SELECT ID FROM #ids 

COMMIT TRANSACTION 

SCOPE_IDENTITY也可以工作,但它的限於一個值。

+0

什麼是一個臨時表的生命期和範圍?我的意思是,可以用其他類似的語句,但用不同的範圍插入iy? –

+0

本地臨時表僅適用於當前連接。您可以擁有全局臨時表(標有'##'),它們可用於所有連接。請參閱[MSDN](http://msdn.microsoft.com/zh-cn/library/ms190315.aspx)。 –

4

我認爲你的語法稍微偏離了一點 - 你可以確定將值插入主表中,並使用OUTPUT子句將其插入輔助表中。

INSERT INTO dbo.personal(firstName) 
OUTPUT INSERTED.pId INTO dbo.owners(pId) 
VALUES('fn') 

這將插入新行personalfirstName設置列fn。然後插入的行的標識列pId被插入到另一個表owners中,作爲該表的pId列。

有關更多詳細信息,請參閱MSDN documentation on the OUTPUT clause - 您可以將任何插入的值輸出到控制檯(例如SQL Server Mgmt Studio),也可以將這些值輸出到臨時或永久表中。

更新:爲「dradu」所指出的那樣 - 這種做法不會在你的情況在這裏工作,因爲在owners表中的列是一個FK約束的一部分(我錯過了這一點從你的問題) 。所以你需要使用一些其他的方式來做到這一點 - 可能輸出的必要信息到一個臨時表/表變量在你的代碼

+1

我不認爲'OUTPUT'子句會直接工作,因爲'owner'表參與外鍵約束。從[MSDN鏈接](http://msdn.microsoft.com/zh-cn/library/ms177564.aspx)您提到: output_table不能:已啓用在其上定義的觸發器;參與FOREIGN KEY約束的任何一方;有CHECK約束或啓用的規則。 –

+0

@marc_s不,所有者表不包含字段pId。我需要這個自動更新,並且其他值,我自己插入。 –

+0

@Anudeep Bulla:所以你開始時使用了錯誤的SQL語句,你在某些條件下得到了正確的答案,但是你對他們不滿意,因爲它們在某些你沒有指定的情況下不起作用。也許你應該讓問題更清楚,或者想出你真正想達到的目標。提取有關您的問題的信息不是社區工作。 –

相關問題