microsoft descargar caracteristicas sql sql-server

caracteristicas - sql server descargar



¿Qué es un "identificador de varias partes" y por qué no puede estar vinculado? (14)

Obtengo continuamente estos errores cuando intento 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''?
¿Cuándo no se puede vincular un ''identificador de varias partes''?
¿De qué está obligado de todos modos?
¿En qué casos ocurrirá 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 enlazar.

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:

Msg 4104, nivel 16, estado 1, línea 3 El identificador de varias partes "dbBWKMigration.dbo.Company.COMPANYNAME" no se pudo enlazar.


Al actualizar las tablas, asegúrese de no hacer referencia al campo de su actualización mediante el 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 declaració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


De hecho, a veces, cuando actualiza una tabla de los datos de otra tabla, creo que uno de los problemas comunes que causa este error es cuando utiliza las abreviaturas de la tabla incorrectamente 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 columna SomeField la SomeField no tiene el calificador t1 como t1.SomeField sino que es solo SomeField .

Si uno intenta actualizarlo especificando t1.SomeField la declaración devolverá el error de varias partes que usted haya notado.


De hecho, me olvidé de unirme a la mesa para los demás y por eso recibí 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)


Descubrí que los obtengo mucho cuando intento abreviar, como por ejemplo:

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.


El mío fue poner el esquema sobre la mesa Alias ​​por error:

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


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 de varias partes 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.


Es probable que sea un error tipográfico. Busque los lugares en su código donde llama [schema]. [TableName] (básicamente en cualquier lugar que 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 larga 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 bonificación 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.


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


Probablemente tengas 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 .Cliente.

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


Si está seguro de que no se trata de un error ortográfico en cuanto a la ortografía, tal vez se trate de un error de tipeo.

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


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


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


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

Algo así como el prompt de redgate sql es brillante para evitar tener que escribirlos manualmente (incluso completa automáticamente las uniones basadas en claves externas), pero no es gratuito. SQL Server 2008 admite intellisense de fábrica, aunque no es tan completo como la versión de Redgate.


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.SubModule ya está definido como SM, pero estoy usando dbo.SubModule en la siguiente línea, por lo tanto, hubo un error. use el nombre declarado en lugar del nombre real. Problema resuelto.