2011-01-31 2 views
5

Je suis en train de courir la redoutée erreur "L'identificateur en plusieurs parties n'a pas pu être lié" sur une procédure stockée sur laquelle je travaille actuellement. J'ai quelques questions en ce qui concerne la requête ci-dessous.Clause de sortie: L'identificateur en plusieurs parties n'a pas pu être lié

  1. Pourquoi ai-je cette erreur?
  2. Pourquoi cette erreur se produirait-elle sur ImportFundingDateTime au lieu de FloorplanId étant donné qu'ils proviennent tous les deux de la même requête, mais FloorplanId est listé en premier dans la clause de sortie?
  3. Puis-je ajuster cette requête pour ne pas obtenir l'erreur tout en conservant la même structure générale?

.

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 vous exécutez la requête en utilisant 'Sélectionnez fp. [FloorplanId], cr. [ImportFundingDateTime], fp. [Timestamp], l'acheteur. [Businessid]' et vos et où des clauses, est-il exécuter sans Erreur? – Thomas

Répondre

6

S'il vous plaît revérifier la syntaxe de la clause SORTIE 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. 

On dirait que vous avez aliasé CacRecord dans la clause FROM comme "cr", mais n'ont pas corrélées avec la clause UPDATE.

Remarque: Même avec elle alias dans la clause FROM et NON aliasé dans la cause UPDATE, SQL Server semble reconnaître CacRecord que la table UPDATE, vous obligeant à utiliser INSERTED au lieu de cr comme le nom de la table virtuelle.

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; 

Pour les visiteurs à cette question, ce bloc de code montre plusieurs tables étant référencées dans la clause SORTIE correctement.

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

Les champs existent définitivement dans les tables référencées. J'ai validé l'orthographe sur eux. –

+1

@Veuillez voir la mise à jour – RichardTheKiwi

+0

La changer pour dire "Update cr" donne exactement la même erreur. –

Questions connexes