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.
Detalles
| Nombre del producto | SQL Server |
| Id. del evento | 4104 |
| Origen del evento | MSSQLSERVER |
| Componente | SQLEngine |
| Nombre simbólico | ALG_MULTI_ID_BAD |
| Texto del mensaje | No se pudo vincular el identificador multipartita "%.*ls". |
Explicación
El nombre de una entidad en SQL Server se conoce como su identificador. Use identificadores cada vez que haga referencia a entidades, por ejemplo, especificando nombres de columna y tabla en una consulta. Un identificador de varias partes contiene uno o varios calificadores como prefijo para el identificador. Por ejemplo, un identificador de tabla puede tener como prefijo calificadores, como el nombre de la base de datos y el nombre de esquema en el que se encuentra la tabla, o un identificador de columna puede tener el prefijo con calificadores como un nombre de tabla o un alias de tabla.
El error 4104 indica que el identificador de 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 tabla o alias usado en la consulta.
Por ejemplo, la siguiente instrucción usa 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
TableB.KeyColde columna de varias partes en la cláusula WHERE como parte de una condición JOIN entre dos tablas; sin embargo,TableBno se hace referencia explícitamente a ella en la consulta.DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;Se proporciona un nombre de alias para la tabla en la cláusula FROM, pero el calificador proporcionado para una columna es el nombre de la tabla. Por ejemplo, la siguiente instrucción usa el nombre
Departmentde la tabla 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 usa un alias, el nombre de la tabla no se puede usar en otra parte de la instrucción .
SQL Server no puede determinar si el identificador multipartes se refiere a una columna precedida por una tabla o a una propiedad de un tipo de datos definido por el usuario de CLR precedida por una columna. Esto sucede porque se hace referencia a las propiedades de las columnas UDT mediante el separador de puntos (.) entre el nombre de columna y el nombre de propiedad de la misma manera 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.myudt2CLR como su tipo de datos. La instrucción SELECT contiene un identificadora.c2de 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
Compare los prefijos de columna con los nombres de tabla o 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 usar el alias como calificador para las columnas asociadas a esa tabla.
Las declaraciones anteriores que hacen referencia a la
HumanResources.Departmenttabla se pueden corregir de la siguiente manera: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 tablas se especifican correctamente. La instrucción DELETE anterior se puede corregir de la siguiente manera:
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 siguiente manera:SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;o
SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;Use nombres únicos y claramente definidos para identificadores. Si lo hace, el código es más fácil de leer y mantener, y también minimiza el riesgo de referencias ambiguas a varias entidades.