184 votes

Qu'est-ce qu'un "identifiant en plusieurs parties" et pourquoi ne peut-il pas être lié ?

Je reçois continuellement ces erreurs lorsque j'essaie de mettre à jour des tables basées sur une autre table. Je finis par réécrire la requête, changer l'ordre des jointures, modifier certains regroupements et finalement cela fonctionne, mais je ne comprends pas bien.

Qu'est-ce qu'un "identifiant en plusieurs parties" ?
Quand un "identifiant en plusieurs parties" ne peut-il pas être lié ?
A quoi est-il lié de toute façon ?
Dans quels cas cette erreur se produit-elle ?
Quelles sont les meilleures façons de l'éviter ?

L'erreur spécifique de SQL Server 2005 est la suivante :

L'identifiant en plusieurs parties "..." n'a pas pu être lié.

Voici un exemple :

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

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

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

L'erreur réelle :

Msg 4104, Level 16, State 1, Line 3 The multi-part identifier "dbBWKMigration.dbo.Company.COMPANYNAME" n'a pas pu être lié.

143voto

Whisk Points 1903

Un identifiant multipartite est toute description d'un champ ou d'une table qui contient plusieurs parties - par exemple MyTable.SomeRow - s'il ne peut pas être lié, c'est qu'il y a un problème - soit une simple faute de frappe, soit une confusion entre table et colonne. Cela peut également être dû à l'utilisation de mots réservés dans vos noms de tables ou de champs, sans les entourer de []. Il peut également être causé par le fait de ne pas inclure toutes les colonnes requises dans la table cible.

Quelque chose comme redgate sql prompt est génial pour éviter d'avoir à les saisir manuellement (il complète même automatiquement les jointures basées sur les clés étrangères), mais il n'est pas gratuit. SQL Server 2008 prend en charge intellisense dès le départ, bien qu'il ne soit pas aussi complet que la version de Redgate.

11 votes

Toujours d'actualité : votre indice de typo a sauvé ma journée.

0 votes

Commentaire pour les nouveaux arrivants : vérifiez votre typo, parfois cela se produit lorsqu'il vous manque une petite pièce. Dans mon cas, il s'agissait de OBJECT_ID(Schema.Table) sans guillemets dans une requête de plus de 50 lignes.

77voto

amadelle Points 51

En fait, parfois, lorsque vous mettez à jour une table à partir des données d'une autre table, je pense que l'un des problèmes courants qui provoquent cette erreur est l'utilisation incorrecte des abréviations de la table. ou lorsqu'ils ne sont pas nécessaires . L'affirmation correcte est ci-dessous :

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

Remarquez que SomeField colonne de Tableau 1 n'a pas le t1 le qualificatif de t1.SomeField mais c'est juste SomeField .

Si on essaie de le mettre à jour en spécifiant t1.SomeField l'instruction renverra l'erreur en plusieurs parties que vous avez remarquée.

3 votes

L'ajout d'un alias de table devant le champ Set cause ce problème dans mon cas.

1 votes

C'était aussi mon problème. J'avais SET ABBREVIATION.My_Field alors que j'avais juste besoin SET.My_Field ;

0 votes

Je suis tombé sur cette erreur en utilisant OPENJSON. ` FROM cust c OUTER APPLY OPENJSON(cust.Addresses) ` jette l'erreur. ` FROM cust c OUTER APPLY OPENJSON(c.Addresses) ` renvoie un jeu de résultats

19voto

Lieutenant Frost Points 393

C'est probablement une faute de frappe. Recherchez les endroits de votre code où vous appelez [schema].[TableName] (en gros, partout où vous faites référence à un champ) et vérifiez que tout est correctement orthographié.

Personnellement, j'essaie d'éviter cela en utilisant des alias pour toutes mes tables. Cela aide énormément lorsque vous pouvez raccourcir un long nom de table en un acronyme de sa description (par exemple WorkOrderParts -> WOP), et rend également votre requête plus lisible.

Edit : En prime, vous économiserez des tonnes de frappes lorsque vous n'aurez qu'à taper un alias de trois ou quatre lettres au lieu des noms de schémas, de tables et de champs.

6voto

Mark S. Rasmussen Points 13313

Liaison = votre représentation textuelle d'une colonne spécifique est mise en correspondance avec une colonne physique dans une table, dans une base de données, sur un serveur.

L'identifiant multipartite peut être : MyDatabase.dbo.MyTable. Si l'un de ces identifiants est erroné, vous avez un identifiant multipartite qui ne peut pas être mis en correspondance.

La meilleure façon de l'éviter est d'écrire la requête correctement dès la première fois, ou d'utiliser un plugin pour Management Studio qui fournit un intellisense et vous aide ainsi à éviter les fautes de frappe.

4voto

Pittsburgh DBA Points 2342

Si vous êtes sûr qu'il ne s'agit pas d'une faute de frappe orthographique, peut-être s'agit-il d'une faute de frappe casuelle.

Quelle collation utilisez-vous ? Vérifiez-le.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X