Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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, masTableBnã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
Departmentda 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
aeb. A tabelabcontém a colunaa, que usa um CLR UDTdbo.myudt2como seu tipo de dados. A instrução SELECT contém um identificador de váriasa.c2partes.CREATE TABLE a (c2 int); GOCREATE TABLE b (a dbo.myudt2); GOSELECT a.c2 FROM a, b;Supondo que a UDT
myudt2não tenha uma propriedade nomeadac2, o SQL Server não pode determinar se o identificadora.c2se refere à colunac2na tabelaaou à colunaa, propriedadec2na tabelab.
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.Departmenttabela podem ser corrigidas da seguinte maneira:SELECT Dept.Name FROM HumanResources.Department AS Dept; GOSELECT Department.Name FROM HumanResources.Department; GOVerifique 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); GOA instrução SELECT acima para
TableApode 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.