2011-01-31 7 views
5

Estoy corriendo hacia el temido error "El identificador de varias partes no se pudo enlazar" en un procedimiento almacenado en el que estoy trabajando actualmente. Tengo algunas preguntas con respecto a la consulta a continuación.Cláusula de salida: el identificador de varias partes no pudo vincularse

  1. ¿Por qué me sale este error?
  2. ¿Por qué se produciría este error en ImportFundingDateTime en lugar de FloorplanId dado que ambos provienen de la misma consulta, pero FloorplanId aparece primero en la cláusula de salida?
  3. ¿Puedo ajustar esta consulta para no obtener el error manteniendo la estructura general igual?

.

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

Si ejecuta la consulta usando 'Selección fp. [FloorplanId], Cr. [ImportFundingDateTime], fp. [Timestamp], el comprador. [Business ID]' y sus ya dónde cláusulas, ¿se ejecute sin ¿error? – Thomas

Respuesta

6

Por favor, vuelva a verificar la sintaxis de la cláusula 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. 

Parece que haya un alias CacRecord en la cláusula FROM como "cr", pero no se han correlacionado con la que la cláusula UPDATE.

Nota: A pesar de que alias en la cláusula FROM y no un alias en la causa UPDATE de SQL Server parece reconocer CacRecord como el UPDATE tabla, lo que requiere que usted utilice INSERTED en lugar de cr como el nombre de la tabla virtual.

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; 

Para los visitantes a esta pregunta, bloque de este código muestra varias tablas que se hace referencia en la cláusula OUTPUT correctamente.

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

Los campos definitivamente existen en las tablas a las que se hace referencia. He validado la ortografía en ellos. –

+1

@please ver respuesta actualizada – RichardTheKiwi

+0

Al cambiarlo para decir "Actualizar cr" se obtiene el mismo error exacto. –

Cuestiones relacionadas