Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Dettagli
| Nome prodotto | SQL Server |
| ID evento | 4104 |
| Origine dell'evento | MSSQLSERVER |
| Componente | SQLEngine |
| Nome simbolico | ID multiplo algoritmo errato |
| Testo del messaggio | Impossibile associare l'identificatore in più parti "%. * ls". |
Spiegazione
Il nome di un'entità in SQL Server viene definito identificatore. Gli identificatori vengono usati ogni volta che si fa riferimento alle entità, ad esempio specificando i nomi di colonna e tabella in una query. Un identificatore in più parti contiene uno o più qualificatori come prefisso per l'identificatore. Ad esempio, un identificatore di tabella può essere preceduto da qualificatori quali il nome del database e il nome dello schema in cui è contenuta la tabella oppure un identificatore di colonna può essere preceduto da qualificatori, ad esempio un nome di tabella o un alias di tabella.
L'errore 4104 indica che non è stato possibile eseguire il mapping dell'identificatore in più parti specificato a un'entità esistente. Questo errore può essere restituito nelle condizioni seguenti:
Il qualificatore fornito come prefisso per un nome di colonna non corrisponde ad alcun nome di tabella o alias utilizzato nella query.
Ad esempio, l'istruzione seguente usa un alias di tabella (
Dept) come prefisso di colonna, ma l'alias della tabella non viene fatto riferimento nella clausola FROM.SELECT Dept.Name FROM HumanResources.Department;Nelle istruzioni seguenti viene specificato un identificatore
TableB.KeyColdi colonna in più parti nella clausola WHERE come parte di una condizione JOIN tra due tabelle,TableBma non viene fatto riferimento in modo esplicito nella query.DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;Nella clausola FROM viene fornito un nome alias per la tabella, ma il qualificatore fornito per una colonna è il nome della tabella. L'istruzione seguente, ad esempio, usa il nome
Departmentdella tabella come prefisso di colonna. La tabella include tuttavia un alias (Dept) a cui viene fatto riferimento nella clausola FROM.SELECT Department.Name FROM HumanResources.Department AS Dept;Quando si usa un alias, il nome della tabella non può essere usato altrove nell'istruzione .
SQL Server non è in grado di determinare se l'identificatore in più parti fa riferimento a una colonna preceduta da una tabella o a una proprietà di un tipo di dati CLR definito dall'utente preceduto da una colonna. Ciò avviene perché le proprietà delle colonne di tipo definito dall'utente sono referenziate usando il punto separatore (.) tra il nome della colonna e il nome della proprietà, nello stesso modo in cui un nome di colonna è preceduto da un nome di tabella. Nell'esempio seguente vengono create due tabelle,
aeb. La tabellabcontiene la colonnaa, che usa un tipo di dati CLR UDTdbo.myudt2. L'istruzione SELECT contiene un identificatorea.c2in più parti.CREATE TABLE a (c2 int); GOCREATE TABLE b (a dbo.myudt2); GOSELECT a.c2 FROM a, b;Supponendo che il tipo
myudt2definito dall'utente non disponga di una proprietà denominatac2, SQL Server non è in grado di determinare se l'identificatorea.c2fa riferimento alla colonnac2nella tabellaao alla colonnaa, proprietàc2nella tabellab.
Azione utente
Trova la corrispondenza tra i prefissi di colonna rispetto ai nomi di tabella o agli alias specificati nella clausola FROM della query. Se viene definito un alias per un nome di tabella nella clausola FROM, è possibile usare l'alias solo come qualificatore per le colonne associate a tale tabella.
Le istruzioni precedenti che fanno riferimento alla
HumanResources.Departmenttabella possono essere corrette nel modo seguente:SELECT Dept.Name FROM HumanResources.Department AS Dept; GOSELECT Department.Name FROM HumanResources.Department; GOAssicurarsi che tutte le tabelle siano specificate nella query e che le condizioni JOIN tra le tabelle siano specificate correttamente. L'istruzione DELETE precedente può essere corretta nel modo seguente:
DELETE FROM dbo.TableA WHERE TableA.KeyCol = (SELECT TableB.KeyCol FROM TableB WHERE TableA.KeyCol = TableB.KeyCol); GOL'istruzione SELECT precedente per
TableApuò essere corretta nel modo seguente:SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;o
SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;Usare nomi univoci e chiaramente definiti per gli identificatori. In questo modo il codice risulta più semplice da leggere e gestire e riduce al minimo il rischio di riferimenti ambigui a più entità.