ইউএনপাইভোট ব্যবহারের সময় এসকিউএল সার্ভারের ডেটাটাইপের দৈর্ঘ্য একই হওয়ার প্রয়োজন কেন?


28

যখন UNPIVOTফাংশনটি স্বাভাবিক হয় না তে প্রয়োগ করার সময় , এসকিউএল সার্ভারের ডেটাটাইপ এবং দৈর্ঘ্য একই হওয়া দরকার be আমি বুঝতে পারি কেন ডেটাটাইপটি একই হতে হবে তবে কেন UNPIVOT এর দৈর্ঘ্য একই হওয়ার দরকার?

ধরা যাক যে আমার কাছে নিম্নোক্ত নমুনা ডেটা রয়েছে যা আমাকে আনপিবট করতে হবে:

CREATE TABLE People
(
    PersonId int, 
    Firstname varchar(50), 
    Lastname varchar(25)
)

INSERT INTO People VALUES (1, 'Jim', 'Smith');
INSERT INTO People VALUES (2, 'Jane', 'Jones');
INSERT INTO People VALUES (3, 'Bob', 'Unicorn');

যদি আমি এর অনুরূপ Firstnameএবং Lastnameকলামগুলিকে UNPIVOT করার চেষ্টা করি :

select PersonId, ColumnName, Value  
from People
unpivot
(
  Value 
  FOR ColumnName in (FirstName, LastName)
) unpiv;

এসকিউএল সার্ভার ত্রুটি উত্পন্ন করে:

এমএসজি 8167, স্তর 16, রাজ্য 1, লাইন 6

UNPIVOT তালিকায় নির্দিষ্ট অন্যান্য কলামগুলির ধরণের সাথে "শেষ নাম" কলামের ধরণের বিরোধ রয়েছে ts

ত্রুটিটি সমাধান করার জন্য, আমাদের অবশ্যই প্রথমে Lastnameকলামটি একই দৈর্ঘ্যের জন্য কাস্ট করতে একটি subquery ব্যবহার করতে হবে Firstname:

select PersonId, ColumnName, Value  
from
(
  select personid, 
    firstname, 
    cast(lastname as varchar(50)) lastname
  from People
) d
unpivot
(
  Value FOR 
  ColumnName in (FirstName, LastName)
) unpiv;

ডেমো সহ এসকিউএল ফিডল দেখুন

UNPIVOT এর আগে SQL সার্ভার 2005 সালে সূচিত হয়ে, আমি একটি ব্যবহার করেন SELECTসঙ্গে UNION ALLunpivot করতে firstname/ lastnameকলাম এবং কোয়েরি একই দৈর্ঘ্য আপনার কলাম রূপান্তর করতে প্রয়োজন ছাড়াই চালানো হবে:

select personid, 'firstname' ColumnName, firstname value
from People
union all
select personid, 'LastName', LastName
from People;

ডেমো সহ এসকিউএল ফিডল দেখুন ।

আমরা CROSS APPLYডেটাটাইপে একই দৈর্ঘ্য না রেখে ব্যবহার করে ডেটা সফলভাবে আনপিবট করতে সক্ষম হয়েছি :

select PersonId, columnname, value
from People
cross apply
(
    select 'firstname', firstname union all
    select 'lastname', lastname
) c (columnname, value);

ডেমো সহ এসকিউএল ফিডল দেখুন ।

আমি এমএসডিএন-এর মাধ্যমে পড়েছি তবে ডাটাটাইপটিতে দৈর্ঘ্য একই হওয়ার জন্য যুক্তির কারণ ব্যাখ্যা করার মতো কিছুই খুঁজে পেলাম না।

UNPIVOT ব্যবহার করার সময় একই দৈর্ঘ্যের প্রয়োজনের পিছনে যুক্তি কী?


4
(সম্ভবত সম্পর্কিত নয় তবে ...) পুনরাবৃত্ত সিটিইর দুটি অংশের কলামের ধরণের তুলনা করার সময় একই কঠোরতা প্রয়োগ করা হয়।
অ্যান্ড্রি এম

উত্তর:


25

UNPIVOT ব্যবহার করার সময় একই দৈর্ঘ্যের প্রয়োজনের পিছনে যুক্তি কী?

এই প্রশ্নটি বাস্তবায়নের ক্ষেত্রে যারা কাজ করেছিলেন কেবলমাত্র সেই ব্যক্তিদের দ্বারা সত্যই উত্তর দেওয়া যেতে পারে UNPIVOTসমর্থনের জন্য তাদের সাথে যোগাযোগ করে আপনি এটি পেতে সক্ষম হতে পারেন । নীচে আমার যুক্তিটি বোঝার জন্য দেওয়া হয়েছে, যা 100% সঠিক নাও হতে পারে:


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

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

এটি বলেছিল, নতুন ভাষার বৈশিষ্ট্য প্রবর্তন করার সময় উন্নতি না করা এবং অতীতের ভুলগুলি এড়ানোর কোনও ভাল কারণ নেই (স্পষ্টত কোনও পিছনে সামঞ্জস্যের ব্যাগেজ নেই)। পুনরাবৃত্তিমূলক সাধারণ টেবিল এক্সপ্রেশনগুলির মতো নতুন বৈশিষ্ট্য (যেমনটি একটি মন্তব্যে অ্যান্ড্রি এম দ্বারা উল্লিখিত ) এবং UNPIVOTতুলনামূলক বুদ্ধিমান শব্দার্থবিজ্ঞান এবং স্পষ্টভাবে সংজ্ঞায়িত নিয়মগুলি মুক্ত ছিল।

টাইপটির দৈর্ঘ্য সহ সুস্পষ্ট টাইপিং খুব বেশি দূরে নেওয়া হচ্ছে কিনা সে সম্পর্কে বিভিন্ন ধরণের মতামত থাকবে তবে ব্যক্তিগতভাবে আমি এটি স্বাগত জানাই। আমার দৃষ্টিতে, প্রকারগুলি varchar(25)এবং varchar(50)একরকম নয় , এর চেয়ে decimal(8)আর বেশি decimal(10)কিছু। বিশেষ কেসিং স্ট্রিং ধরণের রূপান্তর জিনিসগুলিকে অযথা জটিল করে তোলে এবং আমার মতে কোনও আসল মান যোগ করে না।

যে কেউ তর্ক করতে পারে যে কেবলমাত্র নিখুঁত রূপান্তরগুলি যা ডেটা হারাতে পারে তাদের স্পষ্ট করে বলা দরকার, তবে সেখানে প্রান্ত-মামলাগুলিও রয়েছে। শেষ পর্যন্ত, একটি রূপান্তর প্রয়োজন হবে, তাই আমরা পাশাপাশি এটি সুস্পষ্ট করতে পারি।

থেকে অন্তর্নিহিত রূপান্তর যদি varchar(25)করতে varchar(50)অনুমতি দেওয়া হয়, এটা শুধু আরেকটি (সম্ভবত লুকানো) অন্তর্নিহিত রূপান্তর, সব স্বাভাবিক অদ্ভুত প্রান্ত ক্ষেত্রে এবং সাথে থেকে যেতে পারি SETসেটিং সংবেদনশীলতা। বাস্তবায়নটিকে সহজতম এবং সর্বাধিক সুস্পষ্টভাবে কেন সম্ভব করে না? (তবে কিছুই নিখুঁত নয় এবং এটি লজ্জার বিষয় যে কোনওটি লুকিয়ে রাখার varchar(25)এবং তার varchar(50)অভ্যন্তরে sql_variantঅনুমতি দেওয়া হয়))

এর UNPIVOTসাথে পুনর্লিখন APPLYএবং UNION ALL(আরও ভাল) প্রকারের আচরণ এড়ানো হয় কারণ বিধিগুলি UNIONপশ্চাদপদ সামঞ্জস্যের সাপেক্ষে এবং অনলাইনে বই অনলাইনে নথিভুক্ত করা হয় যতক্ষণ না তারা অন্তর্নিহিত রূপান্তর ব্যবহারের সাথে তুলনীয় হয় (যার জন্য ডেটা টাইপের অগ্রাধিকারের তীর নিয়ম রয়েছে) ব্যবহৃত হয়, এবং ইত্যাদি)।

কর্মক্ষেত্রে ডেটা ধরণের সম্পর্কে স্পষ্ট হওয়া এবং যেখানে প্রয়োজন সেখানে স্পষ্ট রূপান্তর যুক্ত করা জড়িত। এটি আমার কাছে অগ্রগতির মতো দেখায় :)

সুস্পষ্টভাবে টাইপ করা কাজটি লেখার একটি উপায়:

SELECT
    U.PersonId,
    U.ColumnName,
    U.Value
FROM dbo.People AS P
CROSS APPLY
(
    VALUES (CONVERT(varchar(50), Lastname))
) AS CA (Lastname)
UNPIVOT
(
    Value FOR
    ColumnName IN (P.Firstname, CA.Lastname)
) AS U;

পুনরাবৃত্ত সিটিই উদাহরণ:

-- Fails
WITH R AS
(
    SELECT Dummy = 'A row'
    UNION ALL
    SELECT 'Another row'
    FROM R
    WHERE Dummy = 'A row'
)
SELECT Dummy
FROM R;

-- Succeeds
WITH R AS
(
    SELECT Dummy = CONVERT(varchar(11), 'A row')
    UNION ALL
    SELECT CONVERT(varchar(11), 'Another row')
    FROM R
    WHERE Dummy = 'A row'
)
SELECT Dummy
FROM R;

পরিশেষে, দ্রষ্টব্য যে CROSS APPLYপ্রশ্নটিতে পুনর্লিখনটি ব্যবহার করে ঠিক তেমন একটি নয় UNPIVOT, কারণ এটি NULLবৈশিষ্ট্যগুলি প্রত্যাখ্যান করে না ।


1

UNPIVOTঅপারেটর সদ্ব্যবহার INঅপারেটর। অপারেটর জন্য বিশেষ উল্লেখ (নীচে স্ক্রীনশট) নির্দেশ করে যে উভয় test_expression(এই ক্ষেত্রে, উপর বাম IN) এবং প্রতিটি expression(ডান দিকে IN) একই ডাটা টাইপ হতে হবে। সাম্যের ট্রানজিটিভ সম্পত্তিকে ধন্যবাদ, প্রতিটি অভিব্যক্তি একই ডেটা টাইপের হতে হবে।

এখানে চিত্র বর্ণনা লিখুন


ঠিক আছে, আমি ডেটাটাইপ প্রয়োজনীয়তা বুঝতে পারি তবে কেন দৈর্ঘ্য একই হতে হবে তা প্রশ্ন।
Taryn

আমি এটি উপেক্ষা করেছি এবং হ্যাঁ, আইএন অপারেটর সাধারণত দৈর্ঘ্যের বিষয়ে যত্ন করে না।
dev_etter

একটি দৈর্ঘ্য নির্দিষ্ট করার প্রয়োজনীয়তাটিকে উপেক্ষা করার অনুমতি দেয় এমন একটি বিকল্প হ'ল প্রত্যেককে এসকিউএল_ভারিয়েন্ট হিসাবে কাস্ট করা: sqlfiddle.com/#!3/13b9a/2/0
dev_etter
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.