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.