MSSQLSERVER_4104MSSQLSERVER_4104

DettagliDetails

Nome prodottoProduct Name SQL ServerSQL Server
ID eventoEvent ID 41044104
Origine eventoEvent Source MSSQLSERVERMSSQLSERVER
ComponenteComponent SQLEngineSQLEngine
Nome simbolicoSymbolic Name ALG_MULTI_ID_BADALG_MULTI_ID_BAD
Testo del messaggioMessage Text Impossibile associare l'identificatore in più parti "%. * ls".The multi-part identifier "%.*ls" could not be bound.

SpiegazioneExplanation

Il nome di un'entità in SQL ServerSQL Server viene definito identificatore.The name of an entity in SQL ServerSQL Server is referred to as its identifier. Gli identificatori vengono utilizzati quando si fa riferimento a entità, ad esempio, quando si specificano nomi di colonne e tabelle in una query.You use identifiers whenever you reference entities, for example, by specifying column and table names in a query. Un identificatore in più parti contiene uno o più qualificatori usati come prefisso.A multi-part identifier contains one or more qualifiers as a prefix for the identifier. Un identificatore di tabella può essere preceduto, ad esempio, da qualificatori come il nome del database e dello schema in cui è contenuta la tabella. Un identificatore di colonna può essere preceduto da qualificatori come un nome o un alias della tabella.For example, a table identifier may be prefixed with qualifiers such as the database name and schema name in which the table is contained, or a column identifier may be prefixed with qualifiers such as a table name or table alias.

L'errore 4104 indica che non è stato possibile eseguire il mapping dell'identificatore in più parti specificato a un'entità esistente.Error 4104 indicates that the specified multi-part identifier could not be mapped to an existing entity. Questo errore può essere restituito nelle condizioni seguenti:This error can be returned under the following conditions:

  • Il qualificatore fornito come prefisso per un nome di colonna non corrisponde ad alcun alias o nome di tabella utilizzato nella query.The qualifier supplied as a prefix for a column name does not correspond to any table or alias name used in the query.

    Nell'istruzione seguente viene, ad esempio utilizzato un alias di tabella (Dept) come prefisso di colonna. Nella clausola FROM non viene tuttavia fatto riferimento a tale alias di tabella.For example, the following statement uses a table alias (Dept) as a column prefix, but the table alias is not referenced in the FROM clause.

    SELECT Dept.Name FROM HumanResources.Department;  
    

    Nelle istruzioni seguenti un identificatore di colonna in più parti TableB.KeyCol viene specificato nella clausola WHERE come parte di una condizione JOIN tra due tabelle. A TableB, tuttavia, non viene fatto riferimento in modo esplicito nella query.In the following statements, a multi-part column identifier TableB.KeyCol is specified in the WHERE clause as part of a JOIN condition between two tables, however, TableB is not explicitly referenced in the query.

    DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;  
    
    SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;  
    
  • Un nome di alias per la tabella viene specificato nella clausola FROM, ma il qualificatore fornito per una colonna è il nome della tabella.An alias name for the table is supplied in the FROM clause, but the qualifier supplied for a column is the table name. Nell'istruzione seguente, ad esempio, viene utilizzato il nome di tabella Department come prefisso di colonna. Nella clausola FROM è stato tuttavia specificato l'alias Dept per la tabella a cui viene fatto riferimento.For example, the following statement uses the table name Department as the column prefix; however, the table has an alias (Dept) referenced in the FROM clause.

    SELECT Department.Name FROM HumanResources.Department AS Dept;  
    

    Quando viene utilizzato un alias, il nome della tabella non può essere utilizzato in altre posizioni all'interno dell'istruzione.When an alias is used, the table name cannot be used elsewhere in the statement.

  • SQL ServerSQL 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 (UTD) preceduto da una colonna. is unable to determine if the multi-part identifier refers to a column prefixed by a table or to a property of a CLR user-defined data type (UDT) prefixed by a column. Ciò accade in quanto alle proprietà delle colonne definite dall'utente viene fatto riferimento utilizzando come separatore il punto (.) tra il nome della colonna e il nome della proprietà, così come un nome di colonna è preceduto da un nome di tabella.This happens because properties of UDT columns are referenced by using the period separator (.) between the column name and the property name in the same way that a column name is prefixed with a table name. Nell'esempio seguente vengono create due tabelle, ovvero a e b.The following example creates two tables, a and b. La tabella b contiene la colonna a che usa il tipo di dati CLR definito dall'utente dbo.myudt2.Table b contains column a, which uses a CLR UDT dbo.myudt2 as its data type. L'istruzione SELECT contiene un identificatore in più parti a.c2.The SELECT statement contains a multi-part identifier a.c2.

    CREATE TABLE a (c2 int);   
    GO  
    
    CREATE TABLE b (a dbo.myudt2);   
    GO  
    
    SELECT a.c2 FROM a, b;   
    

    Presupponendo che il tipo UDT myudt2 non disponga di una proprietà denominata c2, SQL ServerSQL Server non è in grado di determinare se l'identificatore a.c2 fa riferimento alla colonna c2 nella tabella a o alla colonna a, proprietà c2 nella tabella b.Assuming that the UDT myudt2 does not have a property named c2, SQL ServerSQL Server cannot determine whether identifier a.c2refers to column c2 in table a or to the column a, property c2 in table b.

Azione dell'utenteUser Action

  • Mettere in corrispondenza i prefissi di colonna con in nomi di tabella o gli alias specificati nella clausola FROM della query.Match the column prefixes against the table names or alias names specified in the FROM clause of the query. Se un alias è definito per un nome di tabella nella clausola FROM, è possibile utilizzare l'alias solo come qualificatore per le colonne associate alla tabella.If an alias is defined for a table name in the FROM clause, you can only use the alias as a qualifier for columns associated with that table.

    Le istruzioni appena descritte che fanno riferimento alla tabella HumanResources.Department possono essere corrette nel modo seguente:The statements above that reference the HumanResources.Department table can be corrected as follows:

    SELECT Dept.Name FROM HumanResources.Department AS Dept;  
    GO  
    
    SELECT Department.Name FROM HumanResources.Department;  
    GO  
    
  • Assicurarsi che tutte le tabelle vengano specificate nella query e che le condizioni JOIN tra le tabelle vengano specificate correttamente.Ensure that all tables are specified in the query and that the JOIN conditions between tables are specified correctly. L'istruzione DELETE può essere corretta nel modo seguente:The DELETE statement above can be corrected as follows:

    DELETE FROM dbo.TableA  
    WHERE TableA.KeyCol = (SELECT TableB.KeyCol   
                            FROM TableB   
                            WHERE TableA.KeyCol = TableB.KeyCol);  
    GO  
    

    L'istruzione SELECT precedente relativa a TableA può essere corretta nel modo seguente:The SELECT statement above for TableA can be corrected as follows:

    SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;  
    

    oor

    SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;  
    
  • Utilizzare nomi univoci chiaramente definiti per gli identificatoriUse unique, clearly defined names for identifiers. per facilitare la lettura e la gestione del codice e ridurre inoltre il rischio di creare riferimenti ambigui a più entità.Doing so makes your code easier to read and maintain, and it also minimizes the risk of ambiguous references to multiple entities.

Vedere ancheSee Also

MSSQLSERVER_107MSSQLSERVER_107
Identificatori del databaseDatabase Identifiers