Che cos'è un "identificatore multiparte" e perché non può essere associato?


137

Ottengo continuamente questi errori quando provo ad aggiornare le tabelle in base a un'altra tabella. Alla fine riscrivo la query, cambio l'ordine dei join, cambio alcuni raggruppamenti e alla fine funziona, ma non riesco proprio a capirlo.

Che cos'è un "identificatore multiparte"?
Quando un "identificatore multiparte" non può essere associato?
A cosa è legato comunque?
In quali casi si verificherà questo errore?
Quali sono i modi migliori per prevenirlo?

L'errore specifico di SQL Server 2005 è:

L'identificatore multiparte "..." non può essere associato.

Ecco un esempio:

UPDATE  [test].[dbo].[CompanyDetail]

SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC], 
               [Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]

WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**

L'errore reale:

Messaggio 4104, livello 16, stato 1, riga 3 Impossibile identificare l'identificatore in più parti "dbBWKMigration.dbo.Company.COMPANYNAME".

Risposte:


101

Un identificatore multipart è una descrizione di un campo o di una tabella che contiene più parti - ad esempio MyTable.SomeRow - se non può essere associato significa che c'è qualcosa che non va in esso - o hai un semplice errore di battitura o una confusione tra tabella e colonna. Può anche essere causato dall'utilizzo di parole riservate nei nomi di tabella o campo e non circondandole con []. Può anche essere causato non includendo tutte le colonne richieste nella tabella di destinazione.

Qualcosa come il prompt sql di redgate è geniale per evitare di doverli digitare manualmente (completa anche automaticamente i join basati su chiavi esterne), ma non è gratuito. SQL Server 2008 supporta intellisense immediatamente, anche se non è completo come la versione di Redgate.


6
Ancora attuale: il tuo suggerimento di refuso ha salvato la mia giornata
Stefan,

Commento per il risparmio di giorno per i nuovi arrivati: dai un'occhiata al tuo refuso, a volte si verifica quando ti manca un piccolo pezzo. Nel mio problema, era OBJECT_ID (Schema.Table) senza virgolette in una query di oltre 50 righe.
Abdullah Ilgaz,

57

In realtà a volte quando si aggiorna una tabella dai dati di un'altra tabella, penso che uno dei problemi comuni che causano questo errore sia quando si utilizzano le abbreviazioni della tabella in modo errato o quando non sono necessarie . La dichiarazione corretta è di seguito:

Update Table1
Set SomeField = t2.SomeFieldValue 
From Table1 t1 
Inner Join Table2 as t2
    On t1.ID = t2.ID

Si noti che la SomeFieldcolonna di Table1 non ha il t1qualificatore come t1.SomeFieldma è giusto SomeField.

Se si tenta di aggiornarlo specificando t1.SomeFieldl'istruzione, verrà restituito l'errore multiparte che si è notato.


3
L'aggiunta di un alias di tabella nel campo Set anteriore causa questo problema nel mio caso.
Malhaar Punjabi,

1
Anche questo era il mio problema. Avevo SET ABBREVIATION.My_Field, quando avevo solo bisogno SET.My_Field;
VSO,

Ho corso per questo errore durante l'utilizzo di OPENJSON. "FROM cust c OUTER APPLY OPENJSON (cust.Addresses)" ha gettato l'errore. `FROM cust c OUTER APPLY OPENJSON (c.Addresses)` ha restituito il gruppo di risultati
Shaakir,

Potresti trovare utile la spiegazione di sqlservertutorial.net/sql-server-basics/sql-server-update-join :
CAtoOH

17

È probabilmente un errore di battitura. Cerca i punti nel tuo codice in cui chiami [schema]. [TableName] (praticamente ovunque fai riferimento a un campo) e assicurati che tutto sia scritto correttamente.

Personalmente, provo a evitarlo usando gli alias per tutte le mie tabelle. È di grande aiuto quando è possibile abbreviare un nome di tabella lungo con un acronimo della sua descrizione (ovvero WorkOrderParts -> WOP) e rende anche più leggibile la query.

Modifica: come bonus aggiuntivo, risparmierai tonnellate di sequenze di tasti quando tutto ciò che devi digitare è un alias di tre o quattro lettere rispetto allo schema, alla tabella e ai nomi dei campi tutti insieme.


6

Binding = la rappresentazione testuale di una colonna specifica viene mappata su una colonna fisica in una tabella, in alcuni database, in alcuni server.

L'identificatore multipart potrebbe essere: MyDatabase.dbo.MyTable. Se si sbaglia uno di questi identificatori, si dispone di un identificatore multipart che non può essere mappato.

Il modo migliore per evitarlo è scrivere la query nel modo giusto la prima volta oppure utilizzare un plug-in per Management Studio che offra intellisense e quindi ti aiuti evitando errori di battitura.


5

Probabilmente hai un refuso. Ad esempio, se si dispone di una tabella denominata Cliente in un database denominato Vendite, è possibile fare riferimento ad esso come Vendite ... Cliente (anche se è meglio fare riferimento ad esso includendo il nome del proprietario (dbo è il proprietario predefinito) come Sales.dbo .Cliente.

Se hai digitato Vendite ... Cliente, potresti aver ricevuto il messaggio ricevuto.


4

Se sei sicuro che non è un errore di battitura, forse è un errore di battitura.

Quale collazione stai usando? Controllalo.


4

Quando si aggiornano le tabelle, assicurarsi di non fare riferimento al campo dell'aggiornamento tramite l'alias.

Ho appena avuto l'errore con il seguente codice

update [page] 
set p.pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

Ho dovuto rimuovere il riferimento alias nell'istruzione set in modo che sia così

update [page] 
set pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

4

Ho scoperto che ottengo molto questi quando provo ad abbreviare, come ad esempio:

Table1 t1, Table2 t2 
where t1.ID = t2.ID

Modificandolo in:

Table1, Table2 
where Table1.ID = Table2.ID

Fa funzionare la query e non genera l'errore.


3

Codice di errore

FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID =dbo.SubModule.subModuleID 

Codice soluzione

 FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID = SM.subModuleID 

come puoi vedere, nel codice di errore, dbo.SubModuleè già definito come SM, ma sto usando dbo.SubModulenella riga successiva, quindi c'è stato un errore. usa il nome dichiarato invece del nome reale. Problema risolto.


2

Ho avuto questo problema e si è rivelato un alias di tabella errato. La correzione di questo ha risolto il problema.


2

Il mio stava mettendo lo schema sul tavolo Alias ​​per errore:

SELECT * FROM schema.CustomerOrders co
WHERE schema.co.ID = 1  -- oops!

2

L'aggiunta di un alias di tabella nel campo Set anteriore causa questo problema nel mio caso.

Destra aggiornamento Table1 Set SomeField = t2.SomeFieldValue Da Table1 t1 INNER JOIN Table2 come T2 = t1.ID t2.ID

Aggiornamento errato Table1 Set t1.SomeField = t2.SomeFieldValue Da Table1 t1 Inner Join Table2 come t2 On t1.ID = t2.ID


1

Ho avuto P.PayeeName AS 'Payer' --, e le due righe di commento hanno gettato questo errore


1

In realtà mi sono dimenticato di unire il tavolo agli altri, ecco perché ho ricevuto l'errore

Si suppone che sia così:

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation, dbo.Flight
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum =562)

E non in questo modo:

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum = 562)

1

Il mio miglior consiglio quando si verifica l'errore è di usare [] i riquadri per racchiudere i nomi delle tabelle, l'abbreviazione delle tabelle provoca talvolta errori (a volte le abbreviazioni delle tabelle funzionano bene ... strano)


1

Stavo ricevendo questo errore e non riuscivo a vedere dove fosse il problema. Ho ricontrollato tutti i miei alias e sintassi e nulla sembrava fuori posto. La query era simile a quelle che scrivo sempre.

Ho deciso di riscrivere la query (originariamente l'avevo copiata da un file .rdl di report) di seguito, ancora una volta, e ha funzionato bene. Guardando le domande ora, mi sembrano uguali, ma la mia riscritta funziona.

Volevo solo dire che potrebbe valere la pena provare se nient'altro funziona.


1

Quando si digita la tabella FROM, tali errori scompaiono. Digitare FROM sotto a ciò che si digita quindi Intellisense funzionerà e l'identificatore multiparte funzionerà.


0

Ho affrontato questo problema e risolto ma c'è una differenza tra il tuo e il mio codice. Nonostante penso che tu possa capire cos'è "l'identificatore multiparte non può essere associato"

Quando ho usato questo codice

 select * from tbTest where email = sakira@gmail.com

Ho riscontrato un problema con l'identificatore in più parti

ma quando uso una virgoletta singola per l'indirizzo e-mail risolto

 select * from tbTest where email = 'sakira@gmail.com'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.