2008-10-15 22 views
96

Obtengo continuamente 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 no lo entiendo del todo.¿Qué es un "identificador de varias partes" y por qué no puede vincularse?

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

El error específico de SQL Server 2005 es:

The multi-part identifier "..." could not be bound.

Aquí se muestra 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:

Msg 4104, Level 16, State 1, Line 3 The multi-part identifier "dbBWKMigration.dbo.Company.COMPANYNAME" could not be bound.

Respuesta

72

Un identificador de varias partes es cualquier descripción de un campo o tabla que contiene varias partes, por ejemplo, MyTable.SomeRow; si no puede vincularse, significa que hay algo mal con él; o bien tiene un error tipográfico simple, o una confusión entre la mesa y la columna. También puede deberse al uso de palabras reservadas en los nombres de su tabla o campo y no rodearlos con [].

Algo como redgate sql prompt es genial para evitar tener que escribir manualmente estos (incluso se completa automáticamente se basa en claves externas), pero no es gratis. SQL Server 2008 admite intellisense de fábrica, aunque no es tan completo como la versión de Redgate.

+0

todavía actuales: su error tipográfico pista me salvó el día. – Stefan

4

Encuadernación = 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 de multipartes podría ser: MyDatabase.dbo.MyTable. Si obtiene alguno de estos identificadores incorrectos, entonces tiene un identificador multiparte que no se puede mapear.

La mejor manera de evitarlo es escribir la consulta correctamente la primera vez, o usar un complemento para el estudio de administración que proporciona intellisense y así ayudarlo evitando errores tipográficos.

3

Probablemente tenga un error tipográfico. Por ejemplo, si tiene una tabla llamada Cliente en una base de datos llamada Ventas, puede referirse a ella como Cliente de Ventas. (Aunque es mejor referirse a ella incluyendo el nombre del propietario (dbo es el propietario predeterminado) como Sales.dbo .customer.

Si escribió ventas ... al cliente, es posible que haya recibido el mensaje que tienes.

13

es probablemente un error tipográfico. Busque los lugares en su código en el que llama [esquema]. [NombreTabla ] (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 muchísimo cuando puede acortar un nombre de tabla larga a un acrónimo de eso s 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, todos juntos.

3

Si está seguro de que no se trata de un error ortográfico en cuanto a la ortografía, quizás se trate de un error ortográfico en caso de que así sea.

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

3

He descubierto que tengo una gran cantidad éstos cuando intento para abreviar, tales como:

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

Si lo cambia a:

Table1, Table2 
where Table1.ID = Table2.ID 

hace que el trabajo de consulta y no tirar el error.

+0

Oh, esto resolvió mi problema. Muchas gracias ! –

39

En realidad, cuando actualiza una tabla desde los datos de otra tabla, creo que uno de los problemas comunes que causan este error es cuando utiliza las abreviaturas de la tabla incorrectamente o cuando no son necesarias. Lo correcto es el siguiente:

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

en cuenta que SomeField columna de la Tabla 1 no tiene el calificador t1 como t1.SomeField pero es sólo SomeField.

Si se intenta actualizar especificando t1.SomeField, la instrucción devolverá el error de varias partes que ha notado.

+1

¡Gracias! +1 En mi caso ese fue el problema. – Sabuncu

0

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

3

Al actualizar las tablas, asegúrese de no hacer referencia al campo de su actualización mediante el alias.

sólo tenía 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 quitar la referencia de alias en la declaración establecida de modo que se lee como este

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

mina estaba poniendo el esquema en el tabla de alias por error:

SELECT * FROM schema.CustomerOrders co 
WHERE schema.co.ID = 1 -- oops! 
0

que tenía P.PayeeName AS 'Payer' --, y las dos líneas de comentarios lanzaron este error

0

De hecho, me olvidé de unirse a la mesa a los demás por eso me dieron el error

Se supone que es de esta manera:

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) 
0

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 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 se puede ver, en el código de error, ya dbo.SubModule se define como SM, pero yo estoy usando dbo.SubModule en línea siguiente, por lo tanto, hubo un error. usa el nombre declarado en lugar del nombre real. Problema resuelto.

0

Mi mejor consejo cuando se tiene el error es utilizar braquets [] para sorround nombres de tabla, la abreviatura de mesas provoca a veces errores, (en algún momento abreviaturas mesa sólo funcionan bien ... raro)

Cuestiones relacionadas