2011-01-31 2 views
5

현재 작업중인 저장 프로 시저에서 "다중 부분 식별자를 바인딩 할 수 없습니다."오류가 발생합니다. 아래 질문에 관해서 몇 가지 질문이 있습니다.출력 절 : 다중 부분 식별자를 바인딩 할 수 없습니다.

  1. 왜이 오류가 발생합니까?
  2. 둘 다 같은 쿼리에서 나온 FloorplanId 대신 ImportFundingDateTime에서이 오류가 발생하지만 FloorplanId가 출력 절의 첫 번째에 나열됩니다.
  3. 일반 구조를 동일하게 유지하면서 오류가 발생하지 않도록이 쿼리를 조정할 수 있습니까?

.

DECLARE @Results    Table(
    [FloorPlanId]    UNIQUEIDENTIFIER, 
    [ImportFundingDateTime]  DATETIME, 
    [TimeStamp]     VARBINARY(8), 
    [BusinessId]    UNIQUEIDENTIFIER 
    ) 

UPDATE CacRecord 
    SET MatchFound = 1 
    OUTPUT fp.[FloorplanId], cr.[ImportFundingDateTime], 
      fp.[TimeStamp], buyer.[BusinessId] 
    INTO @Results( [FloorplanId], [ImportFundingDateTime], 
        [TimeStamp], [BusinessId]) 
    FROM CacRecord cr WITH (NOLOCK) 
    INNER JOIN CacBatch cb WITH (NOLOCK) 
     ON cr.CacBatchId = cb.CacBatchId 
    INNER JOIN Floorplan fp WITH (NOLOCK) 
     ON fp.UnitVIN = cr.ImportVin 
     AND COALESCE(fp.UnitVIN, '') <> '' 
    INNER JOIN Business buyer WITH (NOLOCK) 
     ON buyer.BusinessId = fp.BuyerBusinessId 
    LEFT OUTER JOIN BusinessContact bc WITH (NOLOCK) 
     ON bc.BusinessId = buyer.BusinessId 
    LEFT OUTER JOIN Contact c WITH (NOLOCK) 
     ON c.ContactId = bc.ContactId 
    WHERE cb.CacJobInstanceId = @cacJobInstanceId 
     AND fp.FloorplanStatusId = 1 --Approved 
     AND COALESCE(cr.ImportVin, '') <> '' 
     AND 1 = 
      CASE 
       WHEN cr.ImportFein = buyer.FederalTaxID 
        AND COALESCE(cr.ImportFein, '') <> '' THEN 1 
       WHEN cr.ImportSsn = c.Ssn 
        AND COALESCE(cr.ImportSsn, '') <> '' THEN 1 
       ELSE 0 
      END; 
+0

당신이 FP를 선택'사용하여 쿼리. FloorplanId], CR. ImportFundingDateTime], FP. [타임 스탬프], 구매자. BusinessId]' 과에서하고 절을 실행하면이없이 실행 않는다 오류? – Thomas

답변

6

당신이 FROM 절과 같은 "CR"에 CacRecord을 별칭을 한 것 같습니다 OUTPUT 절 OUTPUT on MSDN

Syntax 

<column_name> ::= 
{ DELETED | INSERTED | from_table_name } . { * | column_name } 

from_table_name 

Is a column prefix that specifies a table included in the FROM clause 
of a DELETE or UPDATE statement that is used tospecify the rows to 
update or delete. 

의 구문을 다시 확인하지만, UPDATE 절이있는 것을 상관하지 않은하시기 바랍니다.

:이 FROM 절에 별칭과 UPDATE 원인에 별명조차와는 SQL Server는 가상 테이블 이름으로 INSERTED 대신 cr을 사용할 필요는 UPDATE 테이블로 CacRecord을 인식 나타납니다.

이 질문에 방문자를위한
UPDATE cr 
SET MatchFound = 1 
OUTPUT fp.[FloorplanId], INSERTED.[ImportFundingDateTime], 
    fp.[TimeStamp], buyer.[BusinessId] 
INTO @Results([FloorplanId], [ImportFundingDateTime], 
    [TimeStamp], [BusinessId]) 
FROM CacRecord cr WITH (NOLOCK) 
INNER JOIN CacBatch cb WITH (NOLOCK) 
ON cr.CacBatchId = cb.CacBatchId 
INNER JOIN Floorplan fp WITH (NOLOCK) 
ON fp.UnitVIN = cr.ImportVin 
AND COALESCE(fp.UnitVIN, '') <> '' 
INNER JOIN Business buyer WITH (NOLOCK) 
ON buyer.BusinessId = fp.BuyerBusinessId 
LEFT OUTER JOIN BusinessContact bc WITH (NOLOCK) 
ON bc.BusinessId = buyer.BusinessId 
LEFT OUTER JOIN Contact c WITH (NOLOCK) 
ON c.ContactId = bc.ContactId 
WHERE cb.CacJobInstanceId = @cacJobInstanceId 
AND fp.FloorplanStatusId = 1 --Approved 
AND COALESCE(cr.ImportVin, '') <> '' 
AND 1 = 
    CASE 
    WHEN cr.ImportFein = buyer.FederalTaxID 
    AND COALESCE(cr.ImportFein, '') <> '' THEN 1 
    WHEN cr.ImportSsn = c.Ssn 
    AND COALESCE(cr.ImportSsn, '') <> '' THEN 1 
    ELSE 0 
    END; 

,이 코드 블록은 여러 테이블이 제대로 OUTPUT 절에서 참조하는 모습입니다.

create table TO1 (id int, a int); 
create table TO2 (id int, b int); 
create table TO3 (id int, c int); 
insert into TO1 select 1,1; 
insert into TO2 select 1,2; 
insert into TO3 select 1,3; 
insert into TO3 select 1,4; 

declare @catch table (a int, b int, c int) 
update c 
set c = a.a 
output a.a, b.b, INSERTED.c 
into @catch(a,b,c) 
from TO1 a 
inner join TO2 b on a.id=b.id 
inner join TO3 c on a.id=c.id 
+0

필드가 참조 된 테이블에 분명히 존재합니다. 나는 그들에 철자법을 확인했다. –

+1

@please 업데이트 된 답변보기 – RichardTheKiwi

+0

"cr 업데이트"라고 말하면 똑같은 오류가 발생합니다. –

관련 문제