2011-01-31 8 views
5

Sto correndo nel temuto errore "L'identificatore di più parti non può essere associato" su una stored procedure su cui sto attualmente lavorando. Ho alcune domande riguardo alla domanda qui sotto.Clausola di output: l'identificatore a più parti non può essere associato

  1. Perché ricevo questo errore?
  2. Perché questo errore si verifica su ImportFundingDateTime anziché FloorplanId dato che entrambi provengono dalla stessa query, ma FloorplanId è elencato per primo nella clausola output?
  3. Posso regolare questa query per non ottenere l'errore mantenendo la stessa struttura generale?

.

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

Se si esegue la query utilizzando 'Selezionare fp. [FloorplanId], ed. [ImportFundingDateTime], fp. [Timestamp], il compratore. [BusinessID]' e le vostre e dove clausole, ci si esegue senza errore? – Thomas

risposta

6

Si prega di ricontrollare la sintassi della clausola 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. 

Sembra che tu hai alias CacRecord nella clausola FROM come "CR", ma non hanno correlato che con la clausola UPDATE.

Nota: Anche con esso alias nella clausola FROM e NON alias per la causa UPDATE, SQL Server sembra riconoscere CacRecord come la tabella UPDATE, che richiede l'utilizzo di INSERTED anziché cr come il nome della tabella virtuale.

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; 

Per i visitatori di questa domanda, Blocca questo codice mostra più tabelle viene fatto riferimento nella clausola OUTPUT correttamente.

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

I campi esistono sicuramente nelle tabelle a cui si fa riferimento. Ho convalidato l'ortografia su di loro. –

+1

vedere la risposta aggiornata – RichardTheKiwi

+0

Cambiare per dire "Aggiornamento cr" dà lo stesso errore. –

Problemi correlati