Compartilhar via


MSSQLSERVER_4104

Detalhes

Nome do produto SQL Server
ID do evento 4104
Origem do evento MSSQLSERVER
Componente SQLEngine
Nome simbólico ALG_MULTI_ID_BAD
Texto da mensagem O identificador de várias partes "%.*ls" não pôde ser associado.

Explicação

O nome de uma entidade no SQL Server é conhecido como seu identificador. Você usa identificadores sempre que referencia entidades, por exemplo, especificando nomes de coluna e tabela em uma consulta. Um identificador de várias partes contém um ou mais qualificadores como um prefixo para o identificador. Por exemplo, um identificador de tabela pode ser prefixado com qualificadores, como o nome do banco de dados e o nome do esquema no qual a tabela está contida, ou um identificador de coluna pode ser prefixado com qualificadores, como um nome de tabela ou alias de tabela.

O erro 4104 indica que o identificador de várias partes especificado não pôde ser mapeado para uma entidade existente. Esse erro pode ser retornado sob as seguintes condições:

  • O qualificador fornecido como prefixo para um nome de coluna não corresponde a nenhum nome de tabela ou alias usado na consulta.

    Por exemplo, a instrução a seguir usa um alias de tabela (Dept) como um prefixo de coluna, mas o alias da tabela não é referenciado na cláusula FROM.

    SELECT Dept.Name FROM HumanResources.Department;  
    

    Nas declarações abaixo, um identificador de coluna composto por várias partes TableB.KeyCol é especificado na cláusula WHERE como parte de uma condição de JOIN entre duas tabelas, mas TableB não é referenciado diretamente na consulta.

    DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;  
    
    SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;  
    
  • Um nome de alias para a tabela é fornecido na cláusula FROM, mas o qualificador fornecido para uma coluna é o nome da tabela. Por exemplo, a instrução a seguir usa o nome Department da tabela como o prefixo da coluna; no entanto, a tabela tem um alias (Dept) referenciado na cláusula FROM.

    SELECT Department.Name FROM HumanResources.Department AS Dept;  
    

    Quando um alias é usado, o nome da tabela não pode ser usado em outro lugar na instrução.

  • O SQL Server não consegue determinar se o identificador de várias partes se refere a uma coluna prefixada por uma tabela ou a uma propriedade de um UDT (tipo de dados definido pelo usuário) CLR prefixado por uma coluna. Isso acontece porque as propriedades das colunas UDT são referenciadas usando o separador de período (.) entre o nome da coluna e o nome da propriedade da mesma forma que um nome de coluna é prefixado com um nome de tabela. O exemplo a seguir cria duas tabelas a e b. A tabela b contém a coluna a, que usa um CLR UDT dbo.myudt2 como seu tipo de dados. A instrução SELECT contém um identificador de várias a.c2partes.

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

    Supondo que a UDT myudt2 não tenha uma propriedade nomeada c2, o SQL Server não pode determinar se o identificador a.c2se refere à coluna c2 na tabela a ou à coluna a, propriedade c2 na tabela b.

Ação do usuário

  • Associe os prefixos de coluna aos nomes de tabela ou nomes de apelido especificados na cláusula FROM da consulta. Se um alias for definido para um nome de tabela na cláusula FROM, você só poderá usar o alias como um qualificador para colunas associadas a essa tabela.

    As instruções acima que fazem referência à HumanResources.Department tabela podem ser corrigidas da seguinte maneira:

    SELECT Dept.Name FROM HumanResources.Department AS Dept;  
    GO  
    
    SELECT Department.Name FROM HumanResources.Department;  
    GO  
    
  • Verifique se todas as tabelas são especificadas na consulta e se as condições JOIN entre tabelas são especificadas corretamente. A instrução DELETE acima pode ser corrigida da seguinte maneira:

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

    A instrução SELECT acima para TableA pode ser corrigida da seguinte maneira:

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

    ou

    SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;  
    
  • Use nomes exclusivos e claramente definidos para identificadores. Isso facilita a leitura e a manutenção do código e também minimiza o risco de referências ambíguas a várias entidades.

Consulte Também

MSSQLSERVER_107
Identificadores de banco de dados