একটি 'বহু-অংশ সনাক্তকারী' কী এবং কেন এটি আবদ্ধ হতে পারে না?


137

আমি যখন অন্য টেবিলের উপর ভিত্তি করে সারণীগুলি আপডেট করার চেষ্টা করি তখন আমি ক্রমাগত এই ত্রুটিগুলি পাই। আমি ক্যোয়ারির পুনর্লিখন শেষ করেছি, যোগদানের ক্রম পরিবর্তন করি, কিছু গ্রুপিং পরিবর্তন করি এবং পরে শেষ পর্যন্ত এটি কার্যকর হয় তবে আমি কেবল এটি বেশিরভাগেই পাই না।

'মাল্টি-পার্ট আইডেন্টিফায়ার' কী?
যখন 'বহু-অংশ সনাক্তকারী' আবদ্ধ হতে সক্ষম হয় না?
যাইহোক এটি কি আবদ্ধ হয়?
কোন ক্ষেত্রে এই ত্রুটি ঘটবে?
এটি প্রতিরোধের সর্বোত্তম উপায়গুলি কী কী?

এসকিউএল সার্ভার 2005-এর নির্দিষ্ট ত্রুটিটি হ'ল:

মাল্টি পার্ট শনাক্তকারী "..." আবদ্ধ হতে পারে না।

এখানে একটি উদাহরণ:

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

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

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

আসল ত্রুটি:

এমএসজি 4104, স্তর 16, রাজ্য 1, লাইন 3 মাল্টি পার্ট শনাক্তকারী "dbBWKMigration.dbo.Company.COMPANYNAME" আবদ্ধ হতে পারে না।

উত্তর:


101

একটি মাল্টিপার্ট শনাক্তকারী এমন কোনও ক্ষেত্র বা টেবিলের এমন কোনও বিবরণ যা একাধিক অংশ রয়েছে - উদাহরণস্বরূপ MyTable.SomeRow - যদি এটি আবদ্ধ না হতে পারে তবে এর সাথে কিছু ভুল আছে - হয় আপনার একটি সাধারণ টাইপ হয়েছে, বা এর মধ্যে বিভ্রান্তি রয়েছে টেবিল এবং কলাম। এটি আপনার টেবিল বা মাঠের নামগুলিতে সংরক্ষিত শব্দ ব্যবহার করে এবং [] এর সাথে ঘিরে না রেখেও হতে পারে। এটি লক্ষ্য সারণীতে প্রয়োজনীয় কলামগুলি সমস্ত না অন্তর্ভুক্ত করেও হতে পারে।

এগুলি ম্যানুয়ালি টাইপ না করা এড়ানোর জন্য রেডগেট এসকিএল প্রম্পটের মতো কিছু উজ্জ্বল (এটি বিদেশী কীগুলির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে যোগ দেয়) তবে তা নিখরচায় নয়। এসকিউএল সার্ভার ২০০৮ বাক্সের বাইরে ইন্টেলিজেন্স সমর্থন করে, যদিও এটি রেডগেট সংস্করণ হিসাবে পুরোপুরি সম্পূর্ণ নয়।


6
এখনও আসল: আপনার টাইপের ইঙ্গিতটি আমার দিনটি বাঁচিয়েছে।
স্টিফান

নতুনদের জন্য ডে সেভার মন্তব্য: আপনার টাইপগুলি কেবল একবার পরীক্ষা করে দেখুন, কখনও কখনও আপনি যখন কোনও সামান্য অংশ হারিয়ে ফেলেন তখন তা ঘটে। আমার ইস্যুতে এটি 50+ লাইনের ক্যোয়ারিতে কোনও উদ্ধৃতি ছাড়াই OBJECT_ID (স্কিমা. টেবিল) ছিল।
আবদুল্লাহ ইলগাজ

57

আসলে কখনও কখনও যখন আপনি অন্য টেবিলের ডেটা থেকে একটি টেবিল আপডেট করেন, আমি মনে করি যে সাধারণ সমস্যাগুলির মধ্যে একটি কারণ এই ত্রুটি ঘটায়, যখন আপনি নিজের টেবিলের সংক্ষিপ্তরগুলি ভুলভাবে ব্যবহার করেন বা যখন তাদের প্রয়োজন হয় না । সঠিক বিবৃতি নীচে:

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

লক্ষ করুন যে, SomeFieldথেকে কলাম Table1 নেই t1যেমন কোয়ালিফায়ার t1.SomeFieldকিন্তু ঠিক হয় SomeField

কেউ যদি t1.SomeFieldবিবৃতিটি নির্দিষ্ট করে এটি আপডেট করার চেষ্টা করে তবে আপনি যে মাল্টি-পার্ট ত্রুটিটি লক্ষ্য করেছেন তা ফিরে আসবে।


3
সামনে সেট ফিল্ডে টেবিল ওরফে যুক্ত করা আমার ক্ষেত্রে এই সমস্যাটির কারণ হয়।
মালহার পাঞ্জাবী

1
এটি আমার সমস্যাও ছিল। আমার এসইটি ছিল ABBREVIATION.My_Field, যখন আমার কেবল দরকার ছিল SET.My_Field;
ভিএসও

ওপেনজেসন ব্যবহার করার সময় আমি এই ত্রুটির দিকে ছুটে এসেছি। Cust ত্রুটিটি ছুঁড়ে ফেলে আউটর অ্যাপ্লিকেশন ওপেনজসন (ক্রেস্ট। অ্যাড্রেসস) w `Cust গ বাহ্য থেকে আবেদন OPENJSON (c.Addresses)` ফিরে resultset দিলেন
Shaakir

আপনি sqlservertutorial.net/sql-server-basics/sql-server-update-join সহায়ক থেকে ব্যাখ্যাটি খুঁজে পেতে পারেন :
CAtoOH

17

এটি সম্ভবত একটি টাইপ। আপনার কোডের যে জায়গাগুলি আপনি [স্কিমা] কল করেছেন সেগুলি সন্ধান করুন [[টেবিলনাম] (মূলত যেখানেই আপনি কোনও ক্ষেত্রের উল্লেখ করেছেন) এবং নিশ্চিত করুন যে সবকিছু সঠিকভাবে বানান করেছে।

ব্যক্তিগতভাবে, আমি আমার সমস্ত টেবিলের জন্য উপকরণ ব্যবহার করে এড়াতে চেষ্টা করি। এটি যখন আপনি একটি দীর্ঘ টেবিলের নামটি সংক্ষিপ্ত বিবরণ (যেমন ওয়ার্কআর্ডার পার্টস -> ডাব্লুওপি) এর সংক্ষিপ্ত আকারে সংক্ষিপ্ত করতে পারেন এবং আপনার ক্যোয়ারীটি আরও পাঠযোগ্য makes

সম্পাদনা করুন: যুক্ত বোনাস হিসাবে, আপনি যখন টাইপ করতে হবে তখন তিনটি বা চার-বর্ণের ওরফে বনাম, স্কিমা, টেবিল এবং ক্ষেত্রের নামগুলি একসাথে রেখে আপনি কীট্রোকের টন সংরক্ষণ করতে পারবেন।


6

বাইন্ডিং = কোনও নির্দিষ্ট কলামের আপনার পাঠ্য উপস্থাপনাটি কোনও সার্ভারে কিছু টেবিলে, কোনও ডাটাবেসে, একটি শারীরিক কলামে ম্যাপ করা হয়।

মাল্টিপার্ট শনাক্তকারী হতে পারে: মাইডাটাবেস.ডবো.মাইটিবেল। আপনি যদি এই শনাক্তকারীদের কোনওরও ভুল হয়ে থাকেন তবে আপনার কাছে একটি মাল্টিপার্ট শনাক্তকারী রয়েছে যা ম্যাপ করা যায় না।

এটি এড়ানোর সর্বোত্তম উপায় হ'ল প্রথমবারের মতো ক্যোয়ারীটি লেখার জন্য, বা ম্যানেজমেন্ট স্টুডিওর জন্য একটি প্লাগইন ব্যবহার করা যা ইন্টেলিসেন্স সরবরাহ করে এবং এভাবে টাইপগুলি এড়িয়ে আপনাকে সহায়তা করে।


5

আপনার সম্ভবত একটি টাইপ আছে। উদাহরণস্বরূপ, যদি বিক্রয় নামে একটি ডাটাবেসে আপনার গ্রাহক নামে একটি সারণী থাকে তবে আপনি এটিকে বিক্রয়..কাস্টমার হিসাবে উল্লেখ করতে পারেন (যদিও এটি মালিকের নাম (ডিবিও ডিফল্টের মালিক) সহ আরও উল্লেখ করা ভাল) বিক্রয়.ডাবোর মতো refer .ক্রেতা.

আপনি যদি বিক্রয় ... গ্রাহক টাইপ করেন তবে আপনি যে বার্তাটি পেয়েছেন তা সম্ভবত পেয়েছেন।


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 টি সামান্য ফিল্ড = t2 সেট করুন রাইট আপডেট করুন

ভুল আপডেট টেবিল 1 সেট করুন t1.সোমফিল্ড = t2. টেবিল 1 টি 1 ইনার থেকে সোনারফিল্ডের মূল্য T1.ID = t2.ID তে টেবিল 2 তে টি 2 হিসাবে যোগদান করুন



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 টেবিলটি টাইপ করবেন তখন সেই ত্রুটিগুলি অদৃশ্য হয়ে যাবে। আপনার টাইপিংয়ের নীচে FROM টাইপ করুন তারপরে ইন্টেলিসেন্স কীভাবে কাজ করবে এবং বহু-অংশ সনাক্তকারী কাজ করবে।


0

আমি এই সমস্যার মুখোমুখি হয়েছি এবং এটি সমাধান করেছি তবে আপনার এবং আমার কোডের মধ্যে পার্থক্য রয়েছে। তবুও আমি মনে করি আপনি বুঝতে পারবেন "মাল্টি-পার্ট শনাক্তকারীকে আবদ্ধ করা যায়নি"

আমি যখন এই কোডটি ব্যবহার করেছি

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

আমি বহু অংশ সনাক্তকারী সমস্যার মুখোমুখি হয়েছি

তবে আমি যখন ইমেল ঠিকানার জন্য একক উদ্ধৃতি ব্যবহার করি তখন এটি সমাধান হয়ে যায়

 select * from tbTest where email = 'sakira@gmail.com'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.