Share via


MSSQLSERVER_4104

Detalhes

Nome do produto

SQL Server

Versão do produto

10.50

Número da compilação do produto

 

ID do evento

4104

Origem do evento

MSSQLSERVER

Componente

SQLEngine

Nome simbólico

ALG_MULTI_ID_BAD

Texto da mensagem

Não foi possível associar o identificador de várias partes "%.*ls".

Explicação

O nome de uma entidade no SQL Server é referenciado como seu identificador. Use identificadores sempre que referenciar 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 do identificador. Por exemplo, um identificador de tabela pode ter como prefixo 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 ter como prefixo qualificadores como um nome 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 nas 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 prefixo de coluna, mas esse alias não é referenciado na cláusula FROM.

    SELECT Dept.Name FROM HumanResources.Department;
    

    Nas instruções a seguir, um identificador de coluna de várias partes TableB.KeyCol é especificado na cláusula WHERE como parte de uma condição JOIN entre duas tabelas, no entanto, TableB não é referenciado explicitamente 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 de tabela Department como prefixo de coluna; entretanto, 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 de tabela não pode ser usado em nenhum outro lugar na instrução.

  • O SQL Server não pode determinar se o identificador de várias partes se refere a uma coluna com um prefixo de tabela ou a uma propriedade de um tipo de dados CLR definido pelo usuário (UDT) com prefixo de uma coluna. Isso acontece porque as propriedades de colunas UDT são referenciadas utilizando-se o separador de ponto (.) entre o nome da coluna e o nome da propriedade, da mesma forma que um nome de coluna é tem um nome de tabela como prefixo. O exemplo a seguir cria duas tabelas: a e b. A tabela b contém a coluna a, que usa dbo.myudt2 CLR UDT como seu tipo de dados. A SELECT instrução contém um identificador de várias partes a.c2.

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

    Pressupondo que myudt2 UDT não tenha uma propriedade denominada c2, o SQL Server não poderá determinar se o identificador a.c2 se refere a uma coluna c2 na tabela a ou à coluna a, propriedade c2 na tabela b.

Ação do usuário

  • Compare os prefixos de coluna com os nomes de tabela ou de alias 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 esse alias como um qualificador para colunas associadas à tabela.

    As instruções acima que referenciam a tabela HumanResources.Department podem ser corrigidas da seguinte forma:

    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 são condições JOIN entre tabelas são especificadas corretamente. A instrução DELETE acima pode ser corrigida da seguinte forma:

    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 forma:

    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, claramente definidos como identificadores. Isso facilitará a leitura e a manutenção do código e também minimizará o risco de referências ambíguas para várias entidades.