[英]Why primary key is getting repeated in the child tables as foreign key?
我要瘋了,我的意思是我不知道這么多天發生了什么。
客戶正在使用它並將數據插入表中。
EQ_HEADER 是表,在將數據放入其中后,我們將其作為主鍵 EQ_HEADERID 並放入其他表中。
但問題是
在某些情況下....我們從 PARENT 表獲得的 PRIMARY KEY 在所有其他子表中都重復,即使 EQUIPMENTNO 不同。 它只是 1 比 1,但為什么 HEADERID 在很多情況下會重復?
ALTER PROCEDURE [dbo].[InsertEquipmentsDATA]
@FunctionalLocation varchar(30)= null ,
@EquipmentNo varchar(30) = null ,
@IsGeneralEmpty bit=0,
@ANSDTSpecified bit= null,
@ANSDT_General date= null,
@ANSWT_General varchar(13)= null,
@BAUJJ_General varchar(4)= null,
@BAUMM_General varchar(2)= null,
@BEGRU_General varchar(4)= null,
@EQART_General varchar(10)= null,
@ERDAT_General date= null,
@ERDATSpecified bit= null,
@HERLD_General varchar(3)= null,
@HZEIN_General varchar(30)= null,
@HERST_General varchar(30)= null,
@INBDT_General date= null,
@INBDTSpecified bit= null,
@SERGE_General varchar(30)= null,
@TYPBZ_General varchar(20)= null,
@IsHeaderEmpty bit=0,
@DATAB_Header date= null,
@DATABSpecified bit= null,
@DATABI_Header date= null,
@DATABISpecified bit= null,
@EQTYP varchar(1)= null,
@EQUNR varchar(18)= null,
@GUID_Header varchar(36)= null,
@SHTXT_Header varchar(40)= null,
@STTXT_Header varchar(4)= null,
@IsLocationEmpty bit=0,
@ABCKZ_Location varchar(1)= null,
@BEBER_Location varchar(3)= null,
@EQFNR_Location varchar(30)= null,
@MSGRP_Location varchar(8)= null,
@STORT_Location varchar(10)= null,
@SWERK_Location varchar(4)= null,
@IsOrganizationEmpty bit= 0,
@ANLNR_Organizations varchar(12)= null,
@BUKRS_Organizations varchar(4)= null,
@GEWRK_Organizations varchar(20)= null,
@GSBER_Organizations varchar(4)= null,
@INGRP_Organizations varchar(3)= null,
@IWERK_Organizations varchar(4)= null,
@KOKRS_Organizations varchar(4)= null,
@KOSTL_Organizations varchar(10)= null,
@PROID_Organizations varchar(20)= null,
@RBNR_Organizations varchar(9)= null,
--@ATINN_Classification int,
--@ATWRT_Classification varchar(70),
@IsStructureEmpty bit=0,
@HEQNR_Structure varchar(4)= null,
@HEQUI_Structure varchar(18)= null,
@POSNR_Structure varchar(4)= null,
@SUBMT_Structure varchar(40)= null,
@TIDNR_Structure varchar(25)= null,
@TPLNR_Structure varchar(40)= null,
@ATNAM_Characteristic varchar(50)= null,
@ATZHL_Characteristic varchar(3)= null,
@ATBEZ_Characteristic varchar(40)= null,
@ATWRT_Value varchar(40)= null,
@EINHE_Value varchar(6)= null ,
@ATZHL_Value varchar(3)= null ,
@IsSerialEmpty bit= 0,
@B_CHARGE varchar(10)= null,
@B_LAGER varchar(4)= null,
@B_WERK varchar(4)= null ,
@CHARGE varchar(10) = null ,
@LBBSA varchar(2) = null ,
@MATNR varchar(40) = null ,
@SERNR varchar(18) = null ,
@IsWarrantyEmpty bit= 0,
@GWLDT date= null ,
@GWLDTSpecified bit= null,
@GWLEN date = null ,
@GWLENSpecified bit= null,
@ClassificationCollection Classification readonly,
@CharacteristicCollection Characteristic readonly,
@ValueCollection Value readonly,
@StatusRet varchar(20) out,
@ErrorRet varchar(1000) out
AS
BEGIN
Begin Try
Begin Transaction
Declare @Status Char(1)
SET @Status='N'
IF exists (Select * from EQ_Header where EQUNR= @EQUNR)
Begin
Set @StatusRet= 'Change'
Set @ErrorRet= ''
SET @Status='U'
End
-- --Update EQ_Header
-- --Set
-- -- EquipmentNo = @EquipmentNo ,
-- -- DATAB = @DATAB_Header,
-- -- DATABSpecified = @DATABSpecified ,
-- -- DATBI = @DATABI_Header ,
-- -- DATBISpecified = @DATABISpecified ,
-- -- EQTYP = @EQTYP ,
-- -- EQUNR = @EQUNR ,
-- -- SHTXT = @SHTXT_Header ,
-- -- STTXT = @STTXT_Header
-- --where EQUNR= @EQUNR
-- Set @STATUSRet= 'Change'
-- Set @ErrorRet= (Select ERROR_MESSAGE())
-- Commit
-- return
--End
Insert into FunctionalLocations
(
FunctionalLocation
)
values
(
@FunctionalLocation
)
Insert into [dbo].[Equipment]
(
EquipmentNo,
FunctionalLocation,
Status
)
values
(
@EQUNR,
@FunctionalLocation,
'Pending'
)
IF(@IsHeaderEmpty = 0)
Begin
Insert into [dbo].[EQ_Header]
(
EquipmentNo ,
DATAB ,
DATABSpecified ,
DATBI ,
DATBISpecified ,
EQTYP ,
EQUNR ,
SHTXT ,
STTXT,
GUID,
Status,
Transferred
)
values
(
@EquipmentNo ,
@DATAB_Header ,
@DATABSpecified ,
@DATABI_Header ,
@DATABISpecified ,
@EQTYP ,
@EQUNR ,
@SHTXT_Header,
@STTXT_Header,
@GUID_Header,
@Status,
0
)
End
Declare @HeaderID int
Set @HeaderID= IDENT_CURRENT('EQ_Header') --Latest Header ID
IF(@IsGeneralEmpty = 0)
Begin
Insert into [dbo].[EQ_General]
(
EquipmentNo ,
ANSDT ,
ANSDTSpecified ,
ANSWT ,
BAUJJ ,
BAUMM ,
BEGRU ,
EQART ,
ERDAT ,
ERDATSpecified ,
HERLD ,
HERST ,
HZEIN ,
INBDT ,
INBDTSpecified ,
SERGE ,
TYPBZ ,
HeaderID
)
values
(
@EquipmentNo ,
@ANSDT_General ,
@ANSDTSpecified ,
@ANSWT_General ,
@BAUJJ_General ,
@BAUMM_General ,
@BEGRU_General ,
@EQART_General ,
@ERDAT_General ,
@ERDATSpecified ,
@HERLD_General ,
@HERST_General ,
@HZEIN_General,
@INBDT_General ,
@INBDTSpecified ,
@SERGE_General ,
@TYPBZ_General ,
@HeaderID
)
End
IF(@IsLocationEmpty = 0)
Begin
Insert into [dbo].[EQ_Location]
(
EquipmentNo,
ABCKZ ,
BEBER ,
EQFNR ,
MSGRP ,
STORT ,
SWERK,
HeaderID
)
values
(
@EquipmentNo,
@ABCKZ_Location ,
@BEBER_Location ,
@EQFNR_Location ,
@MSGRP_Location ,
@STORT_Location ,
@SWERK_Location,
@HeaderID
)
End
IF(@IsOrganizationEmpty = 0)
Begin
Insert into [dbo].[EQ_Organizations]
(
EquipmentNo,
ANLNR ,
BUKRS ,
GEWRK ,
GSBER ,
INGRP ,
IWERK ,
KOKRS ,
KOSTL ,
PROID ,
RBNR ,
HeaderID
)
values
(
@EquipmentNo,
@ANLNR_Organizations ,
@BUKRS_Organizations ,
@GEWRK_Organizations ,
@GSBER_Organizations ,
@INGRP_Organizations ,
@IWERK_Organizations ,
@KOKRS_Organizations ,
@KOSTL_Organizations ,
@PROID_Organizations ,
@RBNR_Organizations ,
@HeaderID
)
End
IF(@IsStructureEmpty = 0)
Begin
Insert into [dbo].[EQ_Structure]
(
EquipmentNo,
HEQNR ,
HEQUI ,
POSNR ,
SUBMT ,
TIDNR ,
TPLNR,
HeaderID
)
values
(
@EquipmentNo,
@HEQNR_Structure ,
@HEQUI_Structure ,
@POSNR_Structure ,
@SUBMT_Structure ,
@TIDNR_Structure ,
@TPLNR_Structure,
@HeaderID
)
End
IF(@IsSerialEmpty = 0)
Begin
Insert into [dbo].[EQ_Serial]
(
B_CHARGE,
B_LAGER ,
B_WERK ,
CHARGE ,
LBBSA ,
MATNR ,
SERNR,
HeaderID
)
values
(
@B_CHARGE,
@B_LAGER ,
@B_WERK ,
@CHARGE ,
@LBBSA ,
@MATNR ,
@SERNR,
@HeaderID
)
End
IF(@IsWarrantyEmpty = 0)
Begin
Insert into [dbo].[EQ_Warranty]
(
EquipmentNo ,
GWLDT ,
GWLDTSpecified ,
GWLEN ,
GWLENSpecified,
HeaderID
)
values
(
@EquipmentNo ,
@GWLDT ,
@GWLDTSpecified ,
@GWLEN ,
@GWLENSpecified,
@HeaderID
)
End
Declare @ClassificationTypeCount int
Set @ClassificationTypeCount= (Select Count(*) from @ClassificationCollection)
If(@ClassificationTypeCount > 0)
Begin
--Classification
Insert into [dbo].Eq_Classification
(
EquipmentNo,
CLASS,
KLTXT,
KLART,
HeaderID
)
--values
--(
-- @EquipmentNo,
-- @CLASS_Classification,
-- @KLTXT_Classification,
-- @KLART_Classification
--)
Select @EquipmentNo, CLASS, KLTXT, KLART, @HeaderID from @ClassificationCollection
Declare @ClassificationID int
Set @ClassificationID= IDENT_CURRENT('Eq_Classification')
END
--Characteristic
Declare @CharacteristicTypeCount int
Set @CharacteristicTypeCount= (Select Count(*) from @CharacteristicCollection)
If(@CharacteristicTypeCount > 0)
Begin
Insert into [dbo].EQ_Characteristic
(
EquipmentNo,
ATNAM,
ATZHL,
ATBEZ,
HeaderID,
ClassificationID
)
--values
--(
-- @ATNAM_Characteristic,
-- @ATZHL_Characteristic,
-- @ATBEZ_Characteristic
--)
Select @EquipmentNo , ATNAM, ATZHL, ATBEZ, @HeaderID, @ClassificationID from @CharacteristicCollection
END
--Value
Declare @ValueTypeCount int
Set @ValueTypeCount= (Select Count(*) from @ValueCollection)
If(@ValueTypeCount > 0)
Begin
Insert into [dbo].EQ_Value
(
EquipmentNo,
ATWRT,
EINHE,
ATZHL,
HeaderID,
ClassificationID
)
--values
--(
-- @EquipmentNo,
-- @ATWRT_Value,
-- @EINHE_Value,
-- @ATZHL_Value
--)
Select @EquipmentNo, ATWRT, EINHE, ATZHL, @HeaderID, @ClassificationID from @ValueCollection
End
IF(ISNULL(@StatusRet , '') = '')
Begin
Set @STATUSRet= 'Created'
Set @ErrorRet= ''
End
Commit Transaction
End Try
Begin Catch
Set @STATUSRet= 'Failed'
Set @ErrorRet= ( Select CAST(Error_Line() as Varchar(20)) + ':' +ERROR_MESSAGE())
Rollback Transaction
End Catch
END
我建議使用SCOPE_IDENTITY
而不是IDENT_CURRENT
。 SCOPE_IDENTITY
將為您提供為當前 session 和當前 scope 插入的最新標識值。 而IDENT_CURRENT
將為您提供所有會話中表中的值。 如果您有多個客戶端同時調用此過程,則您可能會從不同的客戶端獲取身份值。
恐怕你的 sproc 太長了,無法像這樣完全解析,但我懷疑如果這個問題是間歇性的,那么你可能會發現錯誤與這一行有關:
Set @HeaderID= IDENT_CURRENT('EQ_Header') --Latest Header ID
您可能應該閱讀以下內容:
特別是本節:
IDENT_CURRENT 類似於 SQL Server 2000 (8.x) 身份函數 SCOPE_IDENTITY 和 @@IDENTITY。 所有三個函數都返回最后生成的標識值。 但是,在每個函數中定義 last 的 scope 和 session 不同:
IDENT_CURRENT 返回為任何 session 和任何 scope 中的特定表生成的最后一個標識值。
@@IDENTITY 返回為當前 session 中所有范圍內的任何表生成的最后一個標識值。
SCOPE_IDENTITY 返回為當前 session 和當前 scope 中的任何表生成的最后一個標識值。
您目前正在為任何 scope 和任何 session獲取該表的最后生成 ID。 您可能應該將其更改為 SCOPE_IDENTITY。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.