Wat is een ‘multi-part-identifier’ en waarom kan het niet gebonden zijn?

Ik krijg deze fouten voortdurend wanneer ik tafels probeer te updaten op basis van een andere tabel. Ik heb uiteindelijk de query herschreven, verander de volgorde van joins, verander enkele groeperingen en dan werkt het uiteindelijk, maar ik begrijp het gewoon niet helemaal.

Wat is een ‘Multi-part-identifier’?
Wanneer kan een ‘Multi-part-identifier’ niet gebonden zijn?
Wat wordt het toch gebonden?
In welke gevallen zal deze fout optreden?
Wat zijn de beste manieren om het te voorkomen?

De specifieke fout van SQL Server 2005 is:

Het multi-part-identifier “…” kan niet gebonden zijn.

Hier is een voorbeeld:

UPDATE  [test].[dbo].[CompanyDetail]
SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC], 
               [Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]
WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**

De daadwerkelijke fout:

MSG 4104, Niveau 16, Staat 1, Lijn 3 De Multi-Part Identifier
“dbbwkmigration.dbo.company.comPanyName” kan niet gebonden zijn.


Antwoord 1, Autoriteit 100%

Een Multipart-ID is elke beschrijving van een veld of tabel met meerdere delen – bijvoorbeeld mytable.somerow – als het niet gebonden kan zijn, betekent dat er iets mis mee is – of u hebt een eenvoudige typografie, of een verwarring tussen tafel en kolom. Het kan ook worden veroorzaakt door het gebruik van gereserveerde woorden in uw tabel of veldnamen en deze niet om hen heen met [].
Het kan ook worden veroorzaakt door het niet opnemen van alle gewenste kolommen in de doeltabel.

Iets als redgate sql-promptis geweldig om te voorkomen dat u handmatig typ deze (het vult zelfs automatisch joins aan op basis van externe sleutels), maar is niet gratis. SQL server 2008 ondersteunt out-of-the-box Intellisense, hoewel het niet zo compleet is als de Redgate-versie.


Antwoord 2, autoriteit 54%

Als je de ene tabel bijwerkt vanuit de gegevens van een andere tabel, denk ik dat een van de veelvoorkomende problemen die deze fout veroorzaken, is wanneer je je tabelafkortingen verkeerd gebruikt of wanneer ze niet nodig zijn. De juiste uitspraak staat hieronder:

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

Merk op dat de kolom SomeFielduit Tabel1de kwalificatie t1niet heeft als t1.SomeFieldmaar is gewoon SomeField.

Als men het probeert bij te werken door t1.SomeFieldop te geven, zal het statement de meerdelige fout retourneren die je hebt opgemerkt.


Antwoord 3, autoriteit 14%

Het is waarschijnlijk een typfout. Zoek naar de plaatsen in uw code waar u [schema].[TableName] aanroept (in principe overal waar u naar een veld verwijst) en zorg ervoor dat alles correct is gespeld.

Persoonlijk probeer ik dit te vermijden door aliassen te gebruiken voor al mijn tabellen. Het helpt enorm als je een lange tabelnaam kunt inkorten tot een acroniem van de beschrijving (d.w.z. WorkOrderParts -> WOP), en je zoekopdracht ook leesbaarder maakt.

Bewerken: als een toegevoegde bonus, bespaart u VEEL toetsaanslagen als u alleen een drie- of vierletterige alias hoeft te typen in plaats van de schema-, tabel- en veldnamen samen.


Antwoord 4, autoriteit 5%

Binding = uw tekstuele weergave van een specifieke kolom wordt toegewezen aan een fysieke kolom in een tabel, in een database, op een server.

Een meerdelige identifier zou kunnen zijn: MyDatabase.dbo.MyTable. Als u een van deze id’s verkeerd heeft, heeft u een meerdelige id die niet kan worden toegewezen.

De beste manier om dit te voorkomen, is door de query de eerste keer goed te schrijven, of een plug-in voor beheerstudio te gebruiken die intellisense biedt en u zo helpt door typefouten te vermijden.


Antwoord 5, autoriteit 4%

Ik merkte dat ik deze vaak krijg als ik probeer af te korten, zoals:

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

Wijzigen in:

Table1, Table2 
where Table1.ID = Table2.ID

Zorgt ervoor dat de query werkt en niet de fout veroorzaakt.


Antwoord 6, autoriteit 4%

Je hebt waarschijnlijk een typefout gemaakt. Als u bijvoorbeeld een tabel met de naam Customer hebt in een database met de naam Sales, kunt u ernaar verwijzen als Sales..Customer (hoewel het beter is om ernaar te verwijzen inclusief de naam van de eigenaar (dbo is de standaardeigenaar) zoals Sales.dbo .Klant.

Als je Verkoop…Klant hebt getypt, heb je misschien het bericht ontvangen dat je hebt gekregen.


Antwoord 7, autoriteit 3%

Als je er zeker van bent dat het geen typfout is, is het misschien een typfout in hoofdletters.

Welke sortering gebruikt u? Controleer het.


Antwoord 8, autoriteit 3%

Als u tabellen bijwerkt, zorg er dan voor dat u niet via de alias naar het veld verwijst dat u bijwerkt.

Ik had net de fout met de volgende code

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

Ik moest de aliasreferentie in de vastgestelde verklaring verwijderen, dus het leest dit

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

Antwoord 9, Autoriteit 2%

Ik had dit probleem en het bleek een onjuiste alias te zijn. Corrigeren van dit opgelost het probleem.


Antwoord 10, Autoriteit 2%

De mijne zette per ongeluk het schema op de tafel alias:

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

Antwoord 11, Autoriteit 2%

Tabel alias toevoegen in het veld voor ingesteld zorgt ervoor dat dit probleem in mijn geval.

rechts

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

verkeerde

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

Antwoord 12

Ik had P.PayeeName AS 'Payer' --,
en de twee commentaarlijnen gooiden deze fout


Antwoord 13

Ik ben het eigenlijk vergeten om bij de tafel aan te sluiten op de anderen, daarom heb ik de foutmelding

Moet op deze manier zijn:

 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)

en niet op deze manier:

 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)

Antwoord 14

foutcode

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 

Oplossing Code

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 

Zoals u kunt zien, is in de foutcode, dbo.SubModuleal gedefinieerd als SM, maar ik gebruik dbo.SubModulein de volgende regel, vandaar dat er een fout.
Gebruik de aangegeven naam in plaats van de werkelijke naam. Probleem opgelost.


Antwoord 15

Mijn beste advies Bij het hebben van de fout is om [] braquets te gebruiken voor de namen van de aftellentafel, de afkorting van tabellen veroorzaakt soms fouten, (soms tafelkramingen werken gewoon prima … raar)


Antwoord 16

Ik kreeg deze foutmelding en kon gewoon niet zien waar het probleem was. Ik heb alle aliassen en syntaxis gecontroleerd en niets keek uit de plaats. De query was vergelijkbaar met degenen die ik de hele tijd schrijf.

Ik besloot om de query gewoon opnieuw te schrijven (ik had het oorspronkelijk gekopieerd vanuit een rapport .rdl-bestand) hieronder, opnieuw, en het liep prima. Kijk nu naar de vragen, ze zien er hetzelfde uit voor mij, maar mijn herschreven werken.

wilde gewoon zeggen dat het misschien een schot waard is als niets anders werkt.


Antwoord 17

Wanneer u de tabel typt, verdwijnen deze fouten.
Typ van onder de onderstaande wat uw typen dan op IntelliSense werkt en multi-part-identifier zal werken.


Antwoord 18

Ik heb geconfronteerd met dit probleem en loste het op, maar er is een verschil tussen je en mijncode. Ondanks ik denk dat je begrijpt wat is “het multi-part-identifier kan niet gebonden zijn”

Toen ik deze code gebruikte

select * from tbTest where email = [email protected]

Ik heb geconfronteerd met multi-part-identificator probleem

Maar wanneer ik één offerte voor e-mailadres gebruikt, lost het

op

select * from tbTest where email = '[email protected]'

Antwoord 19

Ik had precies hetzelfde probleem, en vergelijkbaar met je codering had ik het van -veld gemist, nadat het is toegevoegd, weet de query welke tabel de gegevens van

leest


Antwoord 20

De mijne werkte na het verwijderen van vierkante beugels in een substringmethode. Ik ben veranderd van

substring ([dbo.table]. [Kolom], 15,2)

Naar

substring (dbo.table.column, 15,2)

Other episodes