Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: SQL Server
Detalles
| Attribute | Valor |
|---|---|
| Nombre del producto | SQL Server |
| Id. de evento | 4104 |
| Origen de eventos | MSSQLSERVER |
| Componente | SQLEngine |
| Nombre simbólico | ALG_MULTI_ID_BAD |
| Texto del mensaje | El identificador formado por varias partes "%.*ls" no se pudo enlazar. |
Explicación
El nombre de una entidad en SQL Server se conoce como su identificador. Los identificadores se usan siempre que se hace referencia a entidades, por ejemplo, al especificar nombres de tabla y de columna en una consulta. Un identificador formado por varias partes contiene uno o varios calificadores como prefijo del identificador. Por ejemplo, un identificador de tabla puede tener como prefijo calificadores como el nombre de la base de datos y el nombre del esquema que la contienen, o un identificador de columna puede tener como prefijo calificadores como el nombre o el alias de una tabla.
El error 4104 indica que el identificador formado por varias partes especificado no se pudo asignar a una entidad existente. Este error se puede devolver en las condiciones siguientes:
El calificador proporcionado como prefijo para un nombre de columna no corresponde a ningún nombre de alias o tabla utilizado en la consulta.
Por ejemplo, la instrucción siguiente utiliza un alias de tabla (
Dept) como prefijo de columna, pero no se hace referencia al alias de tabla en la cláusula FROM.SELECT Dept.Name FROM HumanResources.Department;En las instrucciones siguientes, se especifica un identificador de columna formado por varias partes
TableB.KeyColen la cláusula WHERE como parte de una condición JOIN entre dos tablas; sin embargo, no se hace referencia explícita aTableBen la consulta.DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;En la cláusula FROM se proporciona un nombre de alias para la tabla, pero el calificador proporcionado para una columna es el nombre de la tabla. Por ejemplo, la instrucción siguiente utiliza el nombre de tabla
Departmentcomo prefijo de columna; sin embargo, la tabla tiene un alias (Dept) al que se hace referencia en la cláusula FROM.SELECT Department.Name FROM HumanResources.Department AS Dept;Cuando se utiliza un alias, el nombre de la tabla no se puede utilizar en ninguna otra parte de la instrucción.
SQL Server no puede determinar si el identificador de varias partes hace referencia a una columna prefijo por una tabla o a una propiedad de un tipo de datos definido por el usuario (UDT) clR prefijado por una columna. Esto sucede porque a las propiedades de las columnas UDT se hace referencia utilizando el separador punto (.) entre el nombre de la columna y el nombre de la propiedad del mismo modo que un nombre de columna tiene como prefijo un nombre de tabla. En el siguiente ejemplo se crean dos tablas:
ayb. La tablabcontiene la columnaa, que usa un UDTdbo.myudt2de CLR como tipo de datos. La instrucción SELECT contiene un identificadora.c2formado por varias partes.CREATE TABLE a (c2 int); GOCREATE TABLE b (a dbo.myudt2); GOSELECT a.c2 FROM a, b;Suponiendo que el UDT
myudt2no tiene una propiedad denominadac2, SQL Server no puede determinar si el identificadora.c2hace referencia a la columnac2de la tablaao a la columnaa, propiedadc2de la tablab.
Acción del usuario
Haga coincidir los prefijos de columna con los nombres de tabla o con los nombres de alias especificados en la cláusula FROM de la consulta. Si se define un alias para un nombre de tabla en la cláusula FROM, solo puede utilizar el alias como calificador para las columnas asociadas a esa tabla.
Las instrucciones anteriores que hacen referencia a la tabla
HumanResources.Departmentse pueden corregir de la forma siguiente:SELECT Dept.Name FROM HumanResources.Department AS Dept; GOSELECT Department.Name FROM HumanResources.Department; GOAsegúrese de que todas las tablas se especifican en la consulta y que las condiciones JOIN entre las tablas se especifican correctamente. La instrucción DELETE anterior se puede corregir de la forma siguiente:
DELETE FROM dbo.TableA WHERE TableA.KeyCol = (SELECT TableB.KeyCol FROM TableB WHERE TableA.KeyCol = TableB.KeyCol); GOLa instrucción SELECT anterior para
TableAse puede corregir de la forma siguiente:SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;o
SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;Utilice nombres únicos y definidos claramente para los identificadores. De este modo, el código es más fácil de leer y mantener, y también se reduce al mínimo el riesgo de que haya referencias ambiguas a varias entidades.