एक 'बहु-भाग पहचानकर्ता' क्या है और यह बाध्य क्यों नहीं हो सकता है?


137

जब मैं किसी अन्य तालिका के आधार पर तालिकाओं को अपडेट करने का प्रयास करता हूं तो मुझे लगातार ये त्रुटियां मिलती हैं। मैं अंत में क्वेरी को फिर से लिखना चाहता हूं, जुड़ने के क्रम को बदल देता हूं, कुछ समूहों को बदल देता हूं और फिर यह अंततः काम करता है, लेकिन मैं अभी इसे प्राप्त नहीं करता हूं।

'बहु-भाग पहचानकर्ता' क्या है?
एक 'बहु-भाग पहचानकर्ता' कब बाध्य नहीं हो सकता है?
क्या यह वैसे भी बाध्य किया जा रहा है?
यह त्रुटि किन मामलों में होगी?
इसे रोकने के सबसे अच्छे तरीके क्या हैं?

SQL सर्वर 2005 से विशिष्ट त्रुटि है:

बहु-भाग पहचानकर्ता "..." बाध्य नहीं हो सकता है।

यहाँ एक उदाहरण है:

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

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

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

वास्तविक त्रुटि:

Msg 4104, स्तर 16, राज्य 1, पंक्ति 3 बहु-भाग पहचानकर्ता "dbBWKMigration.dbo.Company.COMPANYNAME" बाध्य नहीं किया जा सका।

जवाबों:


101

एक मल्टीपार्ट पहचानकर्ता किसी भी फ़ील्ड या तालिका का विवरण होता है जिसमें कई भाग होते हैं - उदाहरण के लिए MyTable.SomeRow - यदि यह बाध्य नहीं हो सकता है तो इसका मतलब है कि इसमें कुछ गड़बड़ है - या तो आपको एक सरल टाइपो मिला है, या इसके बीच एक भ्रम है तालिका और स्तंभ। यह आपकी तालिका या फ़ील्ड नामों में आरक्षित शब्दों का उपयोग करने के कारण भी हो सकता है और उनके साथ [] नहीं। यह लक्ष्य तालिका में आवश्यक सभी कॉलमों को शामिल नहीं करने के कारण भी हो सकता है।

Redgate sql प्रॉम्प्ट की तरह कुछ मैन्युअल रूप से टाइप करने से बचने के लिए शानदार है (यह विदेशी कुंजियों के आधार पर ऑटो- कम्प्लीट जॉइन भी करता है), लेकिन यह मुफ़्त नहीं है। SQL सर्वर 2008 बॉक्स से बाहर intellisense का समर्थन करता है, हालांकि यह रेडगेट संस्करण के रूप में काफी पूरा नहीं है।


6
अभी भी वास्तविक: आपके टाइपो संकेत ने मेरा दिन बचाया।
स्टीफन

नवागंतुकों के लिए डे सेवर टिप्पणी: बस अपने टाइपो की जांच करें, कभी-कभी ऐसा होता है जब आप एक छोटे से टुकड़े को याद कर रहे होते हैं। मेरे अंक में, यह 50+ लाइनों के प्रश्न में कोई उद्धरण के बिना OBJECT_ID (स्कीमा.टेबल) था।
अब्दुल्ला इल्गज़

57

वास्तव में कभी-कभी जब आप किसी अन्य तालिका के डेटा से एक तालिका को अपडेट कर रहे होते हैं, तो मुझे लगता है कि इस त्रुटि का कारण बनने वाले सामान्य मुद्दों में से एक है, जब आप अपनी तालिका संक्षिप्त रूप से गलत तरीके से उपयोग करते हैं या जब उन्हें ज़रूरत नहीं होती है । सही कथन नीचे है:

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

ध्यान दें कि Table1SomeField से कॉलम के पास क्वालिफायर नहीं है, लेकिन बस हैt1t1.SomeFieldSomeField

यदि कोई t1.SomeFieldकथन निर्दिष्ट करके इसे अपडेट करने का प्रयास करता है, तो आपके द्वारा देखे गए बहु-भाग त्रुटि को वापस करेगा।


3
सामने सेट फ़ील्ड में तालिका उपनाम जोड़ने से मेरे मामले में यह समस्या होती है।
मल्हार पंजाबी

1
यह मेरी समस्या भी थी। मेरे पास सेट था ABBREVIATION.My_Field, जब मुझे बस जरूरत थी SET.My_Field;
वीएसओ

OPENJSON का उपयोग करते समय मैं इस त्रुटि पर गया था। `FROM cust c OUTER APPLY OPENJSON (cust.Addresses) ने त्रुटि दी। `FROM cust c OUTER APPLY OPENJSON (c.Addresses)` ने परिणाम दिया
शाकिर

आपको sqlservertutorial.net/sql-server-basics/sql-server-update-join से मदद मिल सकती है :
CAtoOH

17

यह शायद एक टाइपो है। अपने कोड के उन स्थानों की तलाश करें, जहाँ आप [स्कीमा] कहते हैं। [टेबलनेम] (मूल रूप से कहीं भी आप किसी क्षेत्र का संदर्भ देते हैं) और सुनिश्चित करें कि सब कुछ सही ढंग से लिखा गया है।

व्यक्तिगत रूप से, मैं अपने सभी तालिकाओं के लिए उपनाम का उपयोग करके इससे बचने की कोशिश करता हूं। जब आप इसका विवरण (यानी WorkOrderParts -> WOP) के एक लंबे तालिका नाम को छोटा कर सकते हैं, तो यह काफी मदद करता है, और आपकी क्वेरी को अधिक पठनीय भी बनाता है।

संपादित करें: एक अतिरिक्त बोनस के रूप में, जब आप टाइप करना चाहते हैं, तो आप सभी प्रकार के स्कीमा, तालिका, और फ़ील्ड नामों को एक साथ तीन या चार अक्षर वाले उपनामों से बचाएंगे।


6

बाइंडिंग = किसी विशिष्ट स्तंभ का आपका पाठात्मक प्रतिनिधित्व किसी तालिका में, किसी डेटाबेस में, किसी सर्वर पर किसी भौतिक स्तंभ पर मैप किया जाता है।

मल्टीपार्ट पहचानकर्ता हो सकता है: MyDatabase.dbo.MyTable। यदि आपको इनमें से कोई भी पहचानकर्ता गलत है, तो आपके पास एक मल्टीपार्ट पहचानकर्ता है जिसे मैप नहीं किया जा सकता है।

इससे बचने का सबसे अच्छा तरीका यह है कि आप पहली बार क्वेरी को सही से लिखें, या प्रबंधन स्टूडियो के लिए एक प्लगइन का उपयोग करें जो इंटैलिसेंस प्रदान करता है और इस प्रकार आपको टाइपो से बचने में मदद करता है।


5

आपके पास शायद एक टाइपो है। उदाहरण के लिए, यदि आपके पास बिक्री नाम के डेटाबेस में ग्राहक के नाम की एक तालिका है, तो आप इसे बिक्री के रूप में संदर्भित कर सकते हैं..ग्राहक (हालांकि इसका उल्लेख करना बेहतर है, जिसमें मालिक का नाम शामिल है (dbo डिफ़ॉल्ट स्वामी है) जैसे Sales.dbo ।ग्राहक।

यदि आपने बिक्री ... ग्राहक टाइप किया है, तो आपको वह संदेश मिल सकता है जो आपको मिला है।


4

यदि आप सुनिश्चित हैं कि यह टाइपो वर्तनी-वार नहीं है, तो शायद यह टाइपो केस-वार है।

आप किस कॉलेशन का उपयोग कर रहे हैं? इसे जाँचे।


4

जब अद्यतन तालिकाएँ सुनिश्चित करें कि आप अपने अद्यतन को उपनाम के माध्यम से संदर्भित नहीं करते हैं।

मुझे निम्नलिखित कोड के साथ त्रुटि हुई थी

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

मुझे सेट स्टेटमेंट में उर्फ ​​संदर्भ को हटाना था इसलिए यह इस तरह से पढ़ता है

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

4

मैंने पाया कि जब मैं संक्षिप्त करने की कोशिश करता हूं तो मुझे ये बहुत मिलते हैं, जैसे:

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

इसे बदलना:

Table1, Table2 
where Table1.ID = Table2.ID

क्वेरी काम करता है और त्रुटि नहीं फेंकता है।


3

एरर कोड

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 

समाधान कोड

 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 

जैसा कि आप देख सकते हैं, त्रुटि कोड में, dbo.SubModuleपहले से ही एसएम के रूप में परिभाषित किया गया है, लेकिन मैं dbo.SubModuleअगली पंक्ति में उपयोग कर रहा हूं , इसलिए एक त्रुटि थी। वास्तविक नाम के बजाय घोषित नाम का उपयोग करें। समस्या सुलझ गयी।


2

मेरे पास यह मुद्दा था और यह एक गलत तालिका उपनाम था। इसे सुधारने से समस्या हल हो गई।


2

खान गलती से मेज पर उपनाम लिख रहा था:

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

2

सामने सेट फ़ील्ड में तालिका उपनाम जोड़ने से मेरे मामले में यह समस्या होती है।

सही अद्यतन तालिका 1 सेट करें SomeField = t2.SomeFieldValue Table1 t1 से भीतरी तालिका 2 में t2 के रूप में शामिल हों। t1.ID = t2.ID

गलत अद्यतन तालिका 1 सेट t1.SomeField = t2.SomeFieldValue Table1 t1 से इनर 1 पर t2 के रूप में तालिका 2 में शामिल हों। t1.ID = t2.ID


1

मेरे पास था P.PayeeName AS 'Payer' --, और दो टिप्पणी लाइनों ने इस त्रुटि को फेंक दिया


1

मैं वास्तव में दूसरों के लिए तालिका में शामिल होना भूल गया, इसलिए मुझे त्रुटि मिली

इस तरह माना जाता है:

  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)

और इस तरह से नहीं:

  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)

1

त्रुटि होने पर उपयोग करने के लिए मेरी सबसे अच्छी सलाह है [] टेबल के नामों के लिए ब्रैकेट्स का उपयोग करें, टेबल्स का संक्षिप्त नाम कभी-कभी त्रुटियों का कारण बनता है, (कभी-कभी टेबल संक्षिप्ताक्षर सिर्फ ठीक काम करते हैं ... अजीब)


1

मुझे यह त्रुटि मिल रही थी और मैं देख नहीं पाया कि समस्या कहाँ थी। मैंने अपने सभी उपनामों और सिंटैक्स की दोहरी जाँच की और कुछ भी जगह से बाहर नहीं देखा। क्वेरी उन लोगों के समान थी जो मैं हर समय लिखता हूं।

मैंने क्वेरी को फिर से लिखने का फैसला किया (मैंने मूल रूप से इसे एक रिपोर्ट .rdl फ़ाइल से नीचे कॉपी किया था), फिर से, और यह ठीक चला। अब प्रश्नों को देखते हुए, वे मुझे एक ही दिखते हैं, लेकिन मेरा लिखा हुआ काम करता है।

बस यह कहना चाहता था कि अगर कोई और काम नहीं करता है तो यह एक शॉट के लायक हो सकता है।


1

जब आप FROM तालिका टाइप करते हैं तो वे त्रुटियां गायब हो जाएंगी। अपनी टाइपिंग के बाद नीचे से टाइप करें, फिर इंटेलीसेंस काम करेगा और मल्टी-पार्ट आइडेंटिफ़ायर काम करेगा।


0

मैंने इस समस्या का सामना किया और इसे हल किया लेकिन आपके और मेरे कोड में अंतर है। इसके बावजूद मुझे लगता है कि आप समझ सकते हैं कि "बहु-भाग पहचानकर्ता बाध्य नहीं हो सकता है"

जब मैंने इस कोड का इस्तेमाल किया

 select * from tbTest where email = sakira@gmail.com

मुझे मल्टी-भाग पहचानकर्ता समस्या का सामना करना पड़ा

लेकिन जब मैं ईमेल पते के लिए एकल उद्धरण का उपयोग करता हूं तो यह हल हो गया

 select * from tbTest where email = 'sakira@gmail.com'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.