¿Qué es un 'identificador de varias partes' y por qué no se puede vincular?

137

Continuamente recibo estos errores cuando trato de actualizar tablas basadas en otra tabla. Termino reescribiendo la consulta, cambio el orden de las uniones, cambio algunas agrupaciones y finalmente funciona, pero simplemente no lo entiendo.

¿Qué es un 'identificador de varias partes'?
¿Cuándo no se puede vincular un 'identificador de varias partes'?
¿De qué se trata?
¿En qué casos se producirá este error?
¿Cuáles son las mejores formas de prevenirlo?

El error específico de SQL Server 2005 es:

El identificador de varias partes "..." no se pudo vincular.

Aquí hay un ejemplo:

UPDATE  [test].[dbo].[CompanyDetail]

SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC], 
               [Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]

WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**

El error real:

Mensaje 4104, Nivel 16, Estado 1, Línea 3 No se pudo vincular el identificador de varias partes "dbBWKMigration.dbo.Company.COMPANYNAME".

Incluso Mien
fuente

Respuestas:

101

Un identificador multiparte es cualquier descripción de un campo o tabla que contiene múltiples partes, por ejemplo MyTable.SomeRow, si no se puede vincular, eso significa que hay algo mal con él, o tiene un error tipográfico simple o una confusión entre mesa y columna. También puede ser causada por el uso de palabras reservadas en los nombres de su tabla o campo y no rodeándolos con []. También puede ser causado por no incluir todas las columnas requeridas en la tabla de destino.

Algo así como redgate sql prompt es brillante para evitar tener que escribirlos manualmente (incluso completa automáticamente uniones basadas en claves foráneas), pero no es gratis. SQL Server 2008 admite intellisense listo para usar, aunque no es tan completo como la versión de redgate.

Batidor
fuente
66
Todavía actual: su sugerencia de error me salvó el día.
Stefan
Comentario de ahorro de día para los recién llegados: solo revise su error tipográfico, a veces ocurre cuando le falta una pequeña pieza. En mi problema, era OBJECT_ID (Schema.Table) sin comillas en una consulta de más de 50 líneas.
Abdullah Ilgaz
57

En realidad, a veces, cuando está actualizando una tabla a partir de los datos de otra tabla, creo que uno de los problemas comunes que causan este error es cuando usa las abreviaturas de su tabla de manera incorrecta o cuando no son necesarias . La declaración correcta está a continuación:

Update Table1
Set SomeField = t2.SomeFieldValue 
From Table1 t1 
Inner Join Table2 as t2
    On t1.ID = t2.ID

Observe que la SomeFieldcolumna de la Tabla 1 no tiene el t1calificador como t1.SomeFieldpero es justo SomeField.

Si uno intenta actualizarlo especificando que t1.SomeFieldla declaración devolverá el error de varias partes que ha notado.

amadelle
fuente
3
Agregar alias de tabla en el campo Establecer frontal causa este problema en mi caso.
Malhaar Punjabi
1
Este fue mi problema también. Tenía SET ABBREVIATION.My_Field, cuando solo necesitaba SET.My_Field;
VSO
Me encontré con este error mientras usaba OPENJSON. `DE cust c EXTERIOR APLICAR OPENJSON (cust.Addresses)` arrojó el error. `FROM cust c OUTER APPLY OPENJSON (c.Addresses)` devolvió el conjunto de resultados
Shaakir el
Puede encontrar útil la explicación de sqlservertutorial.net/sql-server-basics/sql-server-update-join útil:
CAtoOH
17

Probablemente sea un error tipográfico. Busque los lugares en su código donde llama [esquema]. [TableName] (básicamente en cualquier lugar donde haga referencia a un campo) y asegúrese de que todo esté escrito correctamente.

Personalmente, trato de evitar esto usando alias para todas mis tablas. Ayuda enormemente cuando puede acortar un nombre de tabla largo a un acrónimo de su descripción (es decir, WorkOrderParts -> WOP), y también hace que su consulta sea más legible.

Editar: como una ventaja adicional, ahorrará TONELADAS de pulsaciones de teclas cuando todo lo que tiene que escribir es un alias de tres o cuatro letras frente al esquema, la tabla y los nombres de campo.

Teniente Frost
fuente
6

Enlace = su representación textual de una columna específica se asigna a una columna física en alguna tabla, en alguna base de datos, en algún servidor.

El identificador multiparte podría ser: MyDatabase.dbo.MyTable. Si obtiene alguno de estos identificadores incorrectos, entonces tiene un identificador multiparte que no se puede asignar.

La mejor manera de evitarlo es escribir la consulta correctamente la primera vez, o usar un complemento para el estudio de administración que proporcione inteligencia y, por lo tanto, lo ayude evitando errores tipográficos.

Mark S. Rasmussen
fuente
5

Probablemente tengas un error tipográfico. Por ejemplo, si tiene una tabla llamada Cliente en una base de datos llamada Ventas, podría referirse a ella como Ventas ... Cliente (aunque es mejor referirse a ella, incluido el nombre del propietario (dbo es el propietario predeterminado) como Sales.dbo .Cliente.

Si escribió Ventas ... Cliente, es posible que haya recibido el mensaje que recibió.

HLGEM
fuente
4

Si está seguro de que no es un error tipográfico, puede ser un error tipográfico.

¿Qué colación estás usando? Revisalo.

Pittsburgh DBA
fuente
4

Al actualizar tablas, asegúrese de no hacer referencia al campo de su actualización a través del alias.

Acabo de tener el error con el siguiente código

update [page] 
set p.pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

Tuve que eliminar la referencia de alias en la instrucción set para que se lea así

update [page] 
set pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0
Upio
fuente
4

Descubrí que recibo mucho esto cuando intento abreviar, como:

Table1 t1, Table2 t2 
where t1.ID = t2.ID

Cambiándolo a:

Table1, Table2 
where Table1.ID = Table2.ID

Hace que la consulta funcione y no arroje el error.

jo-mso
fuente
3

Código de error

FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID =dbo.SubModule.subModuleID 

Código de solución

 FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID = SM.subModuleID 

como puede ver, en el código de error, dbo.SubModuleya está definido como SM, pero estoy usando dbo.SubModuleen la siguiente línea, por lo tanto, hubo un error. use el nombre declarado en lugar del nombre real. Problema resuelto.

Onkar Vidhate
fuente
2

Tuve este problema y resultó ser un alias de tabla incorrecto. Corregir esto resolvió el problema.

Matt Setter
fuente
2

El mío estaba poniendo el esquema sobre la mesa Alias ​​por error:

SELECT * FROM schema.CustomerOrders co
WHERE schema.co.ID = 1  -- oops!
desconocido
fuente
2

Agregar alias de tabla en el campo Establecer frontal causa este problema en mi caso.

Right Update Table1 Establezca SomeField = t2.SomeFieldValue From Table1 t1 Inner Join Table2 como t2 en t1.ID = t2.ID

Actualización incorrecta Table1 Establecer t1.SomeField = t2.SomeFieldValue de Table1 t1 Inner Join Table2 como t2 en t1.ID = t2.ID

Malhaar Punjabi
fuente
1

Tenía P.PayeeName AS 'Payer' --, y las dos líneas de comentarios arrojaron este error

Andrew Day
fuente
1

De hecho, olvidé unir la mesa a los demás, por eso recibí el error

Se supone que es así:

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation, dbo.Flight
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum =562)

Y no de esta manera:

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum = 562)
MT_Shikomba
fuente
1

Mi mejor consejo al tener el error es usar [] braquets para rodear los nombres de las tablas, la abreviatura de las tablas a veces causa errores, (a veces las abreviaturas de las tablas funcionan bien ... raro)

ramnz
fuente
1

Estaba recibiendo este error y simplemente no podía ver dónde estaba el problema. Revisé todos mis alias y sintaxis y nada parecía fuera de lugar. La consulta fue similar a las que escribo todo el tiempo.

Decidí volver a escribir la consulta (originalmente la había copiado de un archivo de informe .rdl) a continuación, nuevamente, y funcionó bien. Mirando las consultas ahora, me parecen iguales, pero mi reescrita funciona.

Solo quería decir que valdría la pena intentarlo si nada más funciona.

clamum
fuente
1

Cuando escriba la tabla FROM, esos errores desaparecerán. Escriba FROM debajo de lo que está escribiendo, Intellisense funcionará y el identificador de varias partes funcionará.

David Morrow
fuente
0

Enfrenté este problema y lo resolví, pero hay una diferencia entre tu código y el mío. A pesar de que creo que puedes entender qué es "el identificador de varias partes no se pudo vincular"

Cuando usé este código

 select * from tbTest where email = sakira@gmail.com

Me enfrenté al problema del identificador de varias partes

pero cuando uso una cita simple para la dirección de correo electrónico se resolvió

 select * from tbTest where email = '[email protected]'
Neloy Sarothi
fuente