假設我有我的數據庫中3個表是這樣的:如何在交易完成前使用標識列值?
Person
(personid
,...)---這是實體,personid
是標識列Phone
(phoneid
,...) - - 這是實體,phoneid
是標識列PersonPhone
(personid, phoneid
)---這種關係
當我插入數據INT o表,我需要先插入實體表中的行並獲取生成的id
,然後我需要在關係表中插入一行。
它工作正常。問題是:我有一個交易的存儲過程Try Catch
語句,如:
BEGIN TRY
declare aCursor cursor local fast_forward for (Select Query...)
open aCursor;
fetch next from aCursor into @variables....
while @@fetch_status = 0
begin
INSERT INTO Person(...);
set @personid [email protected]@IDENTITY;
INSERT INTO Phone(...);
set @phoneid [email protected]@IDENTITY;
INSERT INTO PersonPhone(@personid, @phoneid);
end;
END TRY
BEGIN CATCH
close aCursor;
deallocate selectdistributor;
SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage;
ROLLBACK TRAN;
RETURN;
END CATCH
COMMIT;
close aCursor;
deallocate aCursor;
隨着光標,還有更多的是一個記錄將被插入人的電話。運行SP時,它將停止首次插入關係數據。我也可以正確使用@personid,@phoneid,但在事務完成之前,我在INSERT INTO PersonPhone(@personid,@phoneid)上出錯。如:
INSERT語句與FOREIGN KEY約束「Person_PersonPhone_FK1」衝突。衝突發生在數據庫「MYDB」,表「dbo.Person」,列'PersonID'中。
看起來像系統生成的系統在事務完成之前未被識別。
如何解決此問題?
您是否嘗試過使用'SCOPE_IDENTITY()'?你真的應該忘記存在'@@ IDENTITY'。很可能你有觸發器人或電話,你沒有得到你認爲你得到的ID值 – 2013-04-22 18:48:44
另外,你能解釋你的SELECT查詢如何識別一個特定的人屬於一個特定的手機嗎?(我認爲有一個更有效的方法在沒有所有光標的情況下做到這一點。)第三表的目的是什麼似乎比這更簡單的關係(人<->電話真的多對多?)。 – 2013-04-22 18:56:32
非常感謝。我在桌上有觸發器。將@@ Identity更改爲Scope_Identity()後,不再有錯誤,但沒有插入任何記錄! – KentZhou 2013-04-22 19:04:15