MSSQLSERVER_4104
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.KeyCol
en la cláusula WHERE como parte de una condición JOIN entre dos tablas; sin embargo, no se hace referencia explícita aTableB
en 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
Department
como 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:
a
yb
. La tablab
contiene la columnaa
, que usa un UDTdbo.myudt2
de CLR como tipo de datos. La instrucción SELECT contiene un identificadora.c2
formado por varias partes.CREATE TABLE a (c2 int); GO
CREATE TABLE b (a dbo.myudt2); GO
SELECT a.c2 FROM a, b;
Suponiendo que el UDT
myudt2
no tiene una propiedad denominadac2
, SQL Server no puede determinar si el identificadora.c2
hace referencia a la columnac2
de la tablaa
o a la columnaa
, propiedadc2
de 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.Department
se pueden corregir de la forma siguiente:SELECT Dept.Name FROM HumanResources.Department AS Dept; GO
SELECT Department.Name FROM HumanResources.Department; GO
Asegú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); GO
La instrucción SELECT anterior para
TableA
se 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.