2009-12-10 5 views
1

첫 번째 삽입에서 ID를 가져 와서 두 번째 삽입에 사용하는 데 문제가 있습니다. 여기에 (내가 저장 프로 시저를 사용하고 있습니다) 내 SQL입니다 : 내가 처음 저장 프로 시저에 의해 추가 된 레코드의 ID를 얻을 필요가두 번째 저장 프로 시저에서 사용하도록 저장 프로 시저에서 수행 한 첫 번째 삽입에서 ID를 가져 오는 문제

DECLARE @JoinDate date 
DECLARE @ID int 
SET @JoinDate = getdate() 

EXEC Members_Add $(UserID), '$(UserName)', 
     @JoinDate, '$(firstname)', '$(lastname)', NULL, 
     '$(Country)', NULL, '$(stateorprovince)', '$(city)', 
     '$(ziporpostalcode)', '$(addressline1)', '$(addressline2)', 
     '$(MailCountry)', NULL, '$(mailstateprovince)', '$(MailCity)', 
     '$(mailzipcode)', '$(mailaddress)', NULL, NULL, NULL, 
     '$(mobilephone)', NULL, '$(Fax)', '$(Email)', NULL, NULL 

SELECT @ID = SCOPE_IDENTITY() 

EXEC Merchants_Add @ID, NULL, '$(BusinessName)', '$(CorporateName)', 
     '$(contactperson)', '$(OfficePhone)', '$(website)', 
     '$(DirectoryListing)', 'False' 

, 나는 당신이 SELECT @@ IDENTITY 대신 SELECT 최대를 사용해야 읽어 (ID)하지만이 보이지 않는다 작동하는 ...

편집 : 난 그냥 SELECT SCOPE_IDENTITY AS NEW_IDSELECT @@IDENTITY AS NEW_ID 업데이트 지금은 ... A는 에러를 nvarchar을 int로 변환 할 수있는 아이디어를 얻고있다?

편집 # 2 : 지금은 컬럼에 vaule NULL을 삽입 할 수 없습니다지고있어 'MEMBERID'@IDMerchants_Add 절차에있는 하나 그 ... 코드를 다시 업데이트되었습니다.

답변

2

보십시오

DECLARE @JoinDate date 
DECLARE @newId int 
SET @JoinDate = getdate() 

EXEC Members_Add $(UserID), '$(UserName)', @JoinDate, '$(firstname)', '$(lastname)', NULL, '$(Country)', NULL, '$(stateorprovince)', '$(city)', '$(ziporpostalcode)', '$(addressline1)', '$(addressline2)', '$(MailCountry)', NULL, '$(mailstateprovince)', '$(MailCity)', '$(mailzipcode)', '$(mailaddress)', NULL, NULL, NULL, '$(mobilephone)', NULL, '$(Fax)', '$(Email)', NULL, NULL 

SELECT @newId = SCOPE_IDENTITY() 

EXEC Merchants_Add @newId, NULL, '$(BusinessName)', '$(CorporateName)', '$(contactperson)', '$(OfficePhone)', '$(website)', '$(DirectoryListing)', 'False' 

EDIT

변경 : 소스가 필요한 바람직한 SCOPE_IDENTITY을 (사용 구문) 대신 @@ IDENTITY를 반영한다.

3

SCOPE_IDENTITY()를 사용해야합니다.

SCOPE_IDENTITY (Transact-SQL)

@@ IDENTITY에서 살펴보고 SCOPE_IDENTITY는 현재 세션에서 모든 테이블에서 생성 된 마지막 ID 값 을 반환합니다. 그러나 SCOPE_IDENTITY 은 현재 범위 내의 값만 반환합니다. @@ IDENTITY는 특정 범위로 제한된 이 아닙니다.

하기가 선언하고 정체성을 유지하기 위해 T-SQL 변수를 사용할 필요가 @@IDENTITY

+1

문서에서 : 동일한 범위의 ID 열에 삽입 된 마지막 ID 값을 반환합니다. 범위는 모듈, 즉 저장 프로 시저, 트리거, 함수 또는 일괄 처리입니다. 따라서 동일한 저장 프로 시저, 함수 또는 일괄 처리에있는 두 문은 동일한 범위에 있습니다. –

+0

사양 읽기 ... D 및 +1 –

+0

SELECT SELECT @@ IDENTITY AS NEW_ID SELECT SCOPE_IDENTITY() AS NEW_ID로 변경하려고 시도했지만 이제는 nvarchar를 오류로 변환 할 수 없습니다. 질문을 업데이트했습니다. 다른 모습을보실 수 있습니까? – Matt

1

에서이

DECLARE @ID INT 
EXEC Members_Add $(UserID), '$(UserName)', 
     @JoinDate, '$(firstname)', '$(lastname)', NULL, 
     '$(Country)', NULL, '$(stateorprovince)', '$(city)', 
     '$(ziporpostalcode)', '$(addressline1)', '$(addressline2)', 
     '$(MailCountry)', NULL, '$(mailstateprovince)', '$(MailCity)', 
     '$(mailzipcode)', '$(mailaddress)', NULL, NULL, NULL, 
     '$(mobilephone)', NULL, '$(Fax)', '$(Email)', NULL, NULL 

SELECT @ID = SCOPE_IDENTITY() 

EXEC Merchants_Add @ID, NULL, '$(BusinessName)', '$(CorporateName)', 
     '$(contactperson)', '$(OfficePhone)', '$(website)', 
     '$(DirectoryListing)', 'False' 

주처럼 @ID의 사용

뭔가를 사용해보십시오 값. 그리고 일반적으로 @@ Identity가 아닌 Scope_Identity()를 사용해야합니다.

DECLARE @JoinDate dateSET @JoinDate = getdate() 
    Declare @NewId Integer 
    EXEC Members_Add $(UserID), '$(UserName)', @JoinDate, '$(firstname)', 
     '$(lastname)', NULL, '$(Country)', NULL, '$(stateorprovince)',  
     '$(city)', '$(ziporpostalcode)', '$(addressline1)',   
     '$(addressline2)','$(MailCountry)', NULL, '$(mailstateprovince)', ' 
     $(MailCity)','$(mailzipcode)', '$(mailaddress)', NULL, NULL, NULL, 
     '$(mobilephone)', NULL, '$(Fax)', '$(Email)', NULL, NULL 

    -- Here get identity Value 
    Set @NewId = Scope_Identity() 

    EXEC Merchants_Add @NewId, NULL, '$(BusinessName)', '$(CorporateName)', 
     '$(contactperson)', '$(OfficePhone)', '$(website)', 
     '$(DirectoryListing)', 'False' 
관련 문제