একাধিক স্তরের স্তরক্রম তৈরি করুন যেখানে প্রতিটি নোডে এলোমেলো সংখ্যক বাচ্চা থাকে


16

আমাকে এমন কিছু পরীক্ষার ডেটা তৈরি করতে হবে যাতে একটি শ্রেণিবিন্যাস জড়িত। আমি এটি সহজ করে তুলতে এবং বেশ কয়েকটি CROSS JOINগুলি করতে পারি , তবে এটি আমাকে এমন কাঠামো দেবে যা সম্পূর্ণ অভিন্ন / কোনও প্রকারের পরিবর্তন ছাড়াই। এটি কেবল নিস্তেজ মনে হয় না, তবে পরীক্ষার ডেটাগুলির পরিবর্তনের অভাব কখনও কখনও এমন সমস্যার মুখোশ দেয় যা অন্যথায় খুঁজে পাওয়া যায়। সুতরাং, আমি এই বিধিগুলি অনুসরণ করে একটি অ-ইউনিফর্ম শ্রেণিবিন্যাস উত্পন্ন করতে চাই:

  • 3 স্তর গভীর
    • স্তর 1 এলোমেলোভাবে 5 - 20 নোড
    • স্তর 2 হ'ল 1 - 10 নোড, স্তর 1 এর প্রতিটি নোড অনুসারে এলোমেলো
    • স্তর 3 হ'ল 1 - 5 নোড, স্তর 2 এর প্রতিটি নোড অনুসারে এলোমেলো
  • সমস্ত শাখা 3 স্তর গভীর হবে। গভীরতায় অভিন্নতা এই মুহুর্তে ঠিক আছে।
  • যে কোনও স্তরে শিশু নোডের নামগুলিতে ওভারল্যাপ থাকতে পারে (যেমন শিশু নোডের নামগুলি একই স্তরের সমস্ত নোড জুড়ে অনন্য হওয়ার দরকার নেই)।
  • শব্দ "র্যান্ডম" সিউডো-রেণ্ডম, হচ্ছে এখানে সংজ্ঞায়িত করা হয় না স্বতন্ত্র র্যান্ডম। এটি উল্লেখ করা প্রয়োজন যেহেতু "এলোমেলো" শব্দটি প্রায়শই "একটি নির্দিষ্ট সেটটির র্যান্ডম ক্রম যা ডুপ্লিকেট উত্পাদন করে না" বোঝাতে ব্যবহৃত হয়। আমি এলোমেলো = এলোমেলো স্বীকার করি এবং যদি স্তরের 1 এর প্রতিটি নোডের প্রতি শিশুদের সংখ্যা কেবল 4, 7 এবং 8 হয় তবে এমনকি স্তরের 1 এর 20 টি নোড জুড়ে এই নোডের প্রতি 1 - 10 শিশুদের সম্ভাব্য বিস্তার রয়েছে, তাহলে এটি ঠিক আছে, কারণ এটাই এলোমেলো।
  • যদিও নেস্টেড WHILEলুপগুলির সাহায্যে এটি বেশ সহজেই করা যায় তবে অগ্রাধিকারটি সেট-ভিত্তিক পদ্ধতির সন্ধান করা। সাধারণভাবে বলতে গেলে, পরীক্ষার ডেটা উত্পন্ন করার জন্য প্রোডাকশন কোডের দক্ষতার প্রয়োজনীয়তা নেই তবে সেট-ভিত্তিক পদ্ধতির জন্য শুটিং সম্ভবত ভবিষ্যতে আরও শিক্ষামূলক হতে পারে এবং সমস্যার ভিত্তিতে সেট-ভিত্তিক পদ্ধতির সন্ধানে ভবিষ্যতে সহায়তা করবে। সুতরাং WHILEলুপগুলি বিভক্ত নয়, তবে কোনও সেট-ভিত্তিক পদ্ধতির পক্ষে সম্ভব না হলে কেবলমাত্র ব্যবহৃত হতে পারে।
  • সেট-ভিত্তিক = সিটিই, অ্যাপ্লিকেশন ইত্যাদি নির্বিশেষে আদর্শভাবে একটি একক ক্যোয়ারী So সুতরাং কোনও বিদ্যমান বা ইনলাইন নম্বর সারণী ব্যবহার করা ভাল। একটি WHIL / CURSOR / পদ্ধতিগত পদ্ধতির ব্যবহার কাজ করবে না। আমি মনে করি তথ্যগুলির অংশগুলি টেম্প টেবিল বা টেবিলের ভেরিয়েবলগুলিতে জরিমানা করা যায়, যতক্ষণ না অপারেশনগুলি সমস্ত সেট-ভিত্তিক হয়, কোনও লুপ হয় না। তবে, এটি বলা হচ্ছে যে, একক-ক্যোরি পদ্ধতির সম্ভবত একাধিক ক্যোয়ারির পক্ষে অনুকূল থাকতে হবে, যদি না দেখা যায় যে মাল্টি-কোয়েরি পদ্ধতির প্রকৃতপক্ষে আরও ভাল। দয়া করে মনে রাখবেন যে "আরও ভাল" গঠনটি সাধারণত বিষয়গত ;-)। দয়া করে মনে রাখবেন যে পূর্ববর্তী বাক্যে "সাধারণত" ব্যবহারটিও বিষয়গত হয়।
  • এসকিউএল সার্ভারের কোনও সংস্করণ এবং সংস্করণ (2005 এবং আরও নতুন, আমি মনে করি) এটি করবে।
  • কেবল খাঁটি টি-এসকিউএল: যে নির্বোধ এসকিউএলসিএলআর স্টাফের কোনওটিই নেই !! ডেটা তৈরির ক্ষেত্রে কমপক্ষে। ডিরেক্টরি এবং ফাইলগুলি তৈরি করা হবে এসকিউএলসিআরআর ব্যবহার করে। তবে এখানে আমি কী তৈরি করব তার মান উত্পন্ন করতে ফোকাস করছি।
  • টি-এসকিউএল মাল্টি-স্টেটমেন্ট টিভিএফকে প্রক্রিয়াজাতীয় হিসাবে বিবেচনা করা হয়, সেট-ভিত্তিক নয়, যদিও তারা বাইরে একটি সেটে প্রক্রিয়াগত পদ্ধতির মুখোশ দেয়। এমন সময় আছে যখন একেবারে উপযুক্ত। এটি সেই সময়ের একটি নয়। একই লাইনগুলির পাশাপাশি, টি-এসকিউএল স্কেলার ফাংশনগুলিও অনুমোদিত নয়, কেবল এটি প্রক্রিয়াগতও নয়, তবে কোয়েরি অপ্টিমাইজার কখনও কখনও তাদের মানটিকে ক্যাশে করে এবং পুনরাবৃত্তি করে যে আউটপুটটি প্রত্যাশার মতো নয়।
  • টি-এসকিউএল ইনলাইন টিভিএফস (ওরফে আইটিভিএফ) ওকি-ডোকি যেমন সেট-বেসড এবং কার্যকরভাবে ব্যবহারের মতোই [ CROSS | OUTER ] APPLY, যা উপরে বর্ণিত ছিল ঠিক আছে।
  • ক্যোয়ারী (আইস) এর বারবার মৃত্যুদণ্ড কার্যকর করা পূর্ববর্তী রান থেকে বেশিরভাগ ভিন্ন ফলাফল উত্পন্ন করা উচিত।
  • স্পেসিফিকেশন আপডেট 1: চূড়ান্ত ফলাফল সেটটি লেভেল 1 এর প্রতিটি স্বতন্ত্র নোডের জন্য এক সারি হিসাবে প্রকাশ করা উচিত, লেভেল 1 থেকে শুরু করে পুরো পথ রয়েছে। এর অর্থ হ'ল লেভেল 1 এবং লেভেল 2 মানগুলি এক বা একাধিক সারি জুড়ে অগত্যা পুনরাবৃত্তি করবে, কেবলমাত্র একমাত্র লেভেল 3 নোডের মধ্যে কেবলমাত্র একটি মাত্র স্তর 3 নোড রয়েছে।
  • স্পেসিফিকেশন আপডেট 2: প্রতিটি নোডের একটি নাম বা লেবেল রয়েছে, এবং কেবল একটি সংখ্যা নয় এর জন্য খুব দৃ pre় পছন্দ রয়েছে। এটি ফলাফলের পরীক্ষার ডেটা আরও অর্থবহ এবং বাস্তববাদী হওয়ার অনুমতি দেবে।

এই অতিরিক্ত তথ্যের বিষয়টি গুরুত্ব পেয়েছে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে এটি যদি কিছু প্রসঙ্গে থাকতে সহায়তা করে তবে পরীক্ষার ডেটা এই প্রশ্নের আমার উত্তরটির সাথে সম্পর্কিত:

এসকিউএল সার্ভারে এক্সএমএল ফাইলগুলি 2012 আমদানি করুন

এই মুহুর্তে প্রাসঙ্গিক না হলেও, এই শ্রেণিবিন্যাস তৈরির শেষ লক্ষ্যটি পুনরাবৃত্ত ফাইল সিস্টেমের পদ্ধতিগুলি পরীক্ষা করার জন্য একটি ডিরেক্টরি কাঠামো তৈরি করা। স্তর 1 এবং 2 ডিরেক্টরি হবে এবং 3 স্তর ফাইলের নাম হিসাবে শেষ হবে। আমি চারপাশে অনুসন্ধান করেছি (উভয় এখানে এবং গুগলসের মাধ্যমে) এবং একটি এলোমেলো স্তরক্রম তৈরির জন্য কেবল একটি রেফারেন্স পেয়েছি:

লিনাক্স: এলোমেলো ডিরেক্টরি / ফাইলের স্তরক্রম তৈরি করুন

এই প্রশ্নটি (স্ট্যাকওভারফ্লোতে) আসলে কাঙ্ক্ষিত ফলাফলের দিক থেকে বেশ কাছাকাছি কারণ এটি পরীক্ষার জন্য একটি ডিরেক্টরি কাঠামো তৈরি করার চেষ্টা করে। তবে এই প্রশ্নটি (এবং উত্তরগুলি) লিনাক্স / ইউনিক্স শেল স্ক্রিপ্টিংয়ের উপর নিবদ্ধ এবং আমাদের বসবাসের মতো সেট-ভিত্তিক বিশ্ব নয়।

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

হায়ারার্কির উদাহরণ

     Level 1
              Level 3
|---- A
|     |-- 1
|     |   |--- I
|     |
|     |-- 2
|         |--- III
|         |--- VI
|         |--- VII
|         |--- IX
|
|---- B
|     |-- 87
|         |--- AAA
|         |--- DDD
|
|---- C
      |-- ASDF
      |   |--- 11
      |   |--- 22
      |   |--- 33
      |
      |-- QWERTY
      |   |--- beft
      |
      |-- ROYGBP
          |--- Poi
          |--- Moi
          |--- Soy
          |--- Joy
          |--- Roy

উদাহরণস্বরূপ ফলাফল উপরোক্ত শ্রেণিবিন্যাস বর্ণনা করে

Level 1    Level 2    Level 3
A          1          I
A          2          III
A          2          VI
A          2          VII
A          2          IX
B          87         AAA
B          87         DDD
C          ASDF       11
C          ASDF       22
C          ASDF       33
C          QWERTY     beft
C          ROYGBP     Poi
C          ROYGBP     Moi
C          ROYGBP     Soy
C          ROYGBP     Joy
C          ROYGBP     Roy

উত্তর:


9

( ও.পি. এর নোট: পছন্দের সমাধানটি চতুর্থ / চূড়ান্ত কোড ব্লক)

এক্সএমএলটি এখানে ব্যবহারের জন্য ডেটা কাঠামোর সুস্পষ্ট পছন্দ বলে মনে হচ্ছে।

with N as
(
  select T.N
  from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),
              (12),(13),(14),(15),(16),(17),(18),(19),(20)) as T(N)
)

select top(5 + abs(checksum(newid())) % 15)
  N1.N as '@Value',
  (
  select top(1 + abs(checksum(newid())) % 10)
    N2.N as '@Value',
    (
    select top(1 + abs(checksum(newid())) % 5)
      N3.N as '@Value'
    from N as N3
    where N2.N > 0
    for xml path('Level3'), type
    )
  from N as N2
  where N1.N > 0
  for xml path('Level2'), type
  )
from N as N1
for xml path('Level1'), root('Root');

top()প্রতিটি নোডের জন্য এসকিউএল সার্ভারকে বিভিন্ন মান ব্যবহার করার কৌশলটি হ'ল সাব-কোয়েরিকে সহযোগী করে তোলা। N1.N > 0এবং N2.N > 0

এক্সএমএল ফ্ল্যাট করা:

declare @X xml;

with N as
(
  select T.N
  from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),
              (12),(13),(14),(15),(16),(17),(18),(19),(20)) as T(N)
)
select @X  = (
             select top(5 + abs(checksum(newid())) % 15)
               N1.N as '@Value',
               (
               select top(1 + abs(checksum(newid())) % 10)
                 N2.N as '@Value',
                 (
                 select top(1 + abs(checksum(newid())) % 5)
                   N3.N as '@Value'
                 from N as N3
                 where N2.N > 0
                 for xml path('Level3'), type
                 )
               from N as N2
               where N1.N > 0
               for xml path('Level2'), type
               )
             from N as N1
             for xml path('Level1')
             );


select L1.X.value('@Value', 'varchar(10)')+'\'+
       L2.X.value('@Value', 'varchar(10)')+'\'+
       L3.X.value('@Value', 'varchar(10)')
from @X.nodes('/Level1') as L1(X)
  cross apply L1.X.nodes('Level2') as L2(X)
  cross apply L2.X.nodes('Level3') as L3(X);

এবং এক্সএমএল সম্পূর্ণরূপে শূন্য একটি সংস্করণ।

with N as
(
  select T.N
  from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),
              (12),(13),(14),(15),(16),(17),(18),(19),(20)) as T(N)
)
select cast(N1.N as varchar(10))+'\'+
       cast(N2.N as varchar(10))+'\'+
       cast(N3.N as varchar(10))
from (
     select top(5 + abs(checksum(newid())) % 15)
       N.N
     from N
     ) as N1
  cross apply
     (
     select top(1 + abs(checksum(newid())) % 10)
       N.N
     from N
     where N1.N > 0
     ) as N2
  cross apply
     (
     select top(1 + abs(checksum(newid())) % 5)
       N.N
     from N
     where N2.N > 0
     ) as N3;

সহযোগিতা N1.N > 0এবং N2.N > 0এখনও গুরুত্বপূর্ণ।

কেবলমাত্র পূর্ণসংখ্যার পরিবর্তে 20 টি নামযুক্ত একটি টেবিল ব্যবহার করে একটি সংস্করণ।

declare @Elements table
(
  Name nvarchar(50) not null
);

insert into @Elements(Name)
select top(20) C.name 
from sys.columns as C
group by C.name;

select N1.Name + N'\' + N2.Name + N'\' + N3.Name
from (
     select top(5 + abs(checksum(newid())) % 15)
       E.Name
     from @Elements as E
     ) as N1
  cross apply
     (
     select top(1 + abs(checksum(newid())) % 10)
       E.Name
     from @Elements as E
     where N1.Name > ''
     ) as N2
  cross apply
     (
     select top(1 + abs(checksum(newid())) % 5)
       E.Name
     from @Elements as E
     where N2.Name > ''
     ) as N3;

1
আমি নতুন সংস্করণটি আরও ভাল পছন্দ করি। এটি আমার প্রথম প্রয়াসে প্রায় একই জিনিসটি নিয়ে এসেছিল তবে কোনও কারণে আমি TOP(n)2 CROSS APPLYটি তে সঠিকভাবে কাজ করতে পারিনি । আমি অন্য কিছু কাজ করার পরে আমি সেই কোডটি থেকে মুক্তি পেয়েছি বলে আমি আলাদা / ভুলভাবে কী করেছি তা নিশ্চিত নয়। আমি শীঘ্রই পোস্ট করব, এখন আপনি এই আপডেটটি সরবরাহ করেছেন। এবং আমি আমার বেশিরভাগ মন্তব্য উপরেরটি পরিষ্কার করে দিয়েছি।
সলোমন রুটজকি

আমি সবেমাত্র আমার সংস্করণ পোস্ট করেছি। মূল পার্থক্যগুলি হ'ল: ১) যেহেতু আমি টপ (এন) কাজ করতে পারিনি, তাই আমি পুরো nশর্তের মাধ্যমে উপাদানগুলি পেয়েছি এবং ২) আমার এমন nameউপাদান রয়েছে যা র্যান্ডমাইজিং ডিরেক্টরি এবং / অথবা ফাইলের নামগুলির চেয়ে বেশি নিয়ন্ত্রিত ।
সলোমন রুটজকি

এত দিন দূরে থাকায় দুঃখিত, তবে আমি ব্যস্ত হয়ে পড়েছি। তবুও, আমি এটি সম্পর্কে চিন্তাভাবনা করেছি এবং আমার উত্তর এবং আপনার নন- এক্সএমএল সংস্করণের মধ্যে সিদ্ধান্ত নিতে পারছি না। আমি আপনার সরলতা এবং নমনীয়তা পছন্দ করি তবে আমার একটি ফোল্ডার কাঠামো তৈরি করতে নামগুলি ফেরত দেওয়ার দক্ষতা প্রয়োজন। তারপরে আমি বুঝতে পেরেছিলাম যে আমার কাছে ভ্ল্যাডের একটি আপডেট টেবিল আছে এবং তার সাথে যোগ দিতে হবে আদর্শ আউটপুট দেওয়ার জন্য update সুতরাং, যদি জিজ্ঞাসা করা অনুচিত না হয়, আপনি দয়া করে একই আপডেটটি অন্তর্ভুক্ত করার জন্য নিজের আপডেট করতে পারেন? তারপরে সমস্ত 3 টি উত্তর সমতুল্য আউটপুট দেবে (সমস্ত 3 টির তুলনার জন্য আদর্শ) এবং আমি আপনার গ্রহণ করব would এটা কি ঠিক আছে?
সলোমন রুটজ্কি

1
@ শ্রুতজকি আমি উত্তর আপডেট করেছি। কিছুক্ষণ আগে তাই আশা করি আমি এটি ঠিক পেয়েছি এবং আপনি কোথায় খুঁজছেন। আপনি অবশ্যই @Elemetsপ্রতিটি স্তরের থেকে আলাদা আলাদা নামের জন্য একটি স্তর কলাম যুক্ত করতে পারেন।
মিকেল এরিকসন 21

1
@ শ্রুতজকি কোন উদ্বেগ নেই। উত্তরটি আপনার পক্ষে সহায়ক হয়েছিল বলে আমি আনন্দিত।
মিকেল এরিকসন

6

এটি আকর্ষণীয় ছিল।

আমার লক্ষ্যটি ছিল প্রতিটি স্তরের যথাযথভাবে সংযুক্ত শ্রেণিবদ্ধ কাঠামোতে এলোমেলোভাবে শিশু সারি দিয়ে দেওয়া সংখ্যার স্তর তৈরি করা। এই কাঠামোটি প্রস্তুত হয়ে গেলে ফাইল এবং ফোল্ডারের নামের মতো এতে অতিরিক্ত তথ্য যুক্ত করা সহজ।

সুতরাং, আমি একটি গাছ সংরক্ষণের জন্য একটি ক্লাসিক টেবিল তৈরি করতে চেয়েছিলাম:

ID int NOT NULL
ParentID int NULL
Lvl int NOT NULL

যেহেতু আমরা পুনরাবৃত্তি নিয়ে কাজ করছি, তাই পুনরাবৃত্ত সিটিই একটি প্রাকৃতিক পছন্দ বলে মনে হচ্ছে।

আমার একটি সংখ্যার টেবিল লাগবে । টেবিলে নাম্বার 1. থেকে শুরু করা উচিত সেখানে টেবিল কমপক্ষে 20 নম্বর হওয়া উচিত: MAX(LvlMax)

CREATE TABLE [dbo].[Numbers](
    [Number] [int] NOT NULL,
CONSTRAINT [PK_Numbers] PRIMARY KEY CLUSTERED 
(
    [Number] ASC
));

INSERT INTO Numbers(Number)
SELECT TOP(1000)
    ROW_NUMBER() OVER(ORDER BY S.object_id)  AS Number
FROM
    sys.all_objects AS S
ORDER BY Number;

ডেটা তৈরির জন্য প্যারামিটারগুলি একটি সারণীতে সংরক্ষণ করা উচিত:

DECLARE @Intervals TABLE (Lvl int, LvlMin int, LvlMax int);
INSERT INTO @Intervals (Lvl, LvlMin, LvlMax) VALUES
(1, 5, 20),
(2, 1, 10),
(3, 1, 5);

দ্রষ্টব্য, যে ক্যোয়ারীটি বেশ নমনীয় এবং সমস্ত পরামিতি এক জায়গায় পৃথক করা হয়েছে। প্রয়োজনে আপনি আরও স্তর যোগ করতে পারেন, কেবলমাত্র প্যারামিটারগুলির একটি অতিরিক্ত সারি যুক্ত করুন।

এ জাতীয় গতিশীল প্রজন্মকে সম্ভব করার জন্য আমাকে পরের স্তরের জন্য এলোমেলো সংখ্যক সারি মনে রাখতে হবে, তাই আমার একটি অতিরিক্ত কলাম রয়েছে ChildRowCount

অনন্য উত্পাদনও IDsকিছুটা জটিল। গ্যারান্টিটি যে IDsপুনরাবৃত্তি হবে না তা নিশ্চিত করার জন্য আমি প্রতি 1 প্যারেন্ট সারিতে 100 শিশু সারিটির সীমা কঠোরভাবে কোডিং করেছি । এই যে POWER(100, CTE.Lvl)কি সম্পর্কে। ফলস্বরূপ বড় ব্যবধান রয়েছে IDs। এই সংখ্যাটি একটি হতে পারে MAX(LvlMax), তবে আমি সরলতার জন্য ক্যোয়ারিতে ধ্রুব 100 রেখেছি। স্তরের সংখ্যা কঠোর কোডড নয়, তবে এটি দ্বারা নির্ধারিত হয় @Intervals

এই সূত্র

CAST(CRYPT_GEN_RANDOM(4) as int) / 4294967295.0 + 0.5

পরিসরে একটি এলোমেলো ভাসমান পয়েন্ট সংখ্যা উত্পন্ন করে [0..1), যা পরে প্রয়োজনীয় বিরতিতে স্কেল করা হয়।

ক্যোয়ারির যুক্তিটি সহজ। এটি পুনরাবৃত্ত হয়। প্রথম পদক্ষেপটি প্রথম স্তরের সারিগুলির একটি সেট উত্পন্ন করে। এলোমেলো সংখ্যা দ্বারা সারিগুলির সংখ্যা নির্ধারিত হয় TOP। এছাড়াও, প্রতিটি সারির জন্য পৃথক এলোমেলো সংখ্যক শিশু সারি সঞ্চিত আছে ChildRowCount

রিকারসিভ অংশ CROSS APPLYপ্রতিটি প্যারেন্ট সারিতে প্রদত্ত সংখ্যক শিশু সারি তৈরি করতে ব্যবহার করে। এর WHERE Numbers.Number <= CTE.ChildRowCountপরিবর্তে আমাকে ব্যবহার করতে হয়েছিল TOP(CTE.ChildRowCount), কারণ TOPসিটিইর পুনরাবৃত্তির অংশে অনুমোদিত নয়। এসকিউএল সার্ভারের এই সীমাবদ্ধতা সম্পর্কে আগে জানতাম না।

WHERE CTE.ChildRowCount IS NOT NULL পুনরাবৃত্তি থামায়।

এসকিউএল ফিডল

WITH
CTE
AS
(
    SELECT 
        TOP(CAST(
            (CAST(CRYPT_GEN_RANDOM(4) as int) / 4294967295.0 + 0.5) * 
            (
                1 + (SELECT I.LvlMax FROM @Intervals AS I WHERE I.Lvl = 1)
                  - (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = 1)
            )
            + (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = 1)
            AS int))
        Numbers.Number AS ID
        ,NULL AS ParentID
        ,1 AS Lvl
        ,CAST(
            (CAST(CRYPT_GEN_RANDOM(4) as int) / 4294967295.0 + 0.5) * 
            (
                1 + (SELECT I.LvlMax FROM @Intervals AS I WHERE I.Lvl = 2)
                  - (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = 2)
            )
            + (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = 2)
            AS int) AS ChildRowCount
    FROM Numbers
    ORDER BY Numbers.Number

    UNION ALL

    SELECT
        CA.Number + CTE.ID * POWER(100, CTE.Lvl) AS ID
        ,CTE.ID AS ParentID
        ,CTE.Lvl + 1 AS Lvl
        ,CA.ChildRowCount
    FROM
        CTE
        CROSS APPLY
        (
            SELECT
                Numbers.Number
                ,CAST(
                    (CAST(CRYPT_GEN_RANDOM(4) as int) / 4294967295.0 + 0.5) * 
                    (
                    1 + (SELECT I.LvlMax FROM @Intervals AS I WHERE I.Lvl = CTE.Lvl + 2)
                      - (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = CTE.Lvl + 2)
                    )
                    + (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = CTE.Lvl + 2)
                    AS int) AS ChildRowCount
            FROM Numbers
            WHERE Numbers.Number <= CTE.ChildRowCount
        ) AS CA
    WHERE
        CTE.ChildRowCount IS NOT NULL
)
SELECT *
FROM CTE
ORDER BY Lvl, ParentID, ID;

ফলাফল (আপনি ভাগ্যবান হলে 20 + 20 * 10 + 200 * 5 = 1220 সারি পর্যন্ত থাকতে পারে)

+---------+----------+-----+-------------------+
|   ID    | ParentID | Lvl | ChildRowCount     |
+---------+----------+-----+-------------------+
|       1 | NULL     |   1 | 3                 |
|       2 | NULL     |   1 | 1                 |
|       3 | NULL     |   1 | 6                 |
|       4 | NULL     |   1 | 5                 |
|       5 | NULL     |   1 | 3                 |
|       6 | NULL     |   1 | 7                 |
|       7 | NULL     |   1 | 1                 |
|       8 | NULL     |   1 | 6                 |
|     101 | 1        |   2 | 3                 |
|     102 | 1        |   2 | 5                 |
|     103 | 1        |   2 | 1                 |
|     201 | 2        |   2 | 5                 |
|     301 | 3        |   2 | 4                 |
|     302 | 3        |   2 | 5                 |
|     303 | 3        |   2 | 1                 |
|     304 | 3        |   2 | 2                 |
|     305 | 3        |   2 | 4                 |
|     306 | 3        |   2 | 3                 |
|     401 | 4        |   2 | 3                 |
|     402 | 4        |   2 | 1                 |
|     403 | 4        |   2 | 2                 |
|     404 | 4        |   2 | 2                 |
|     405 | 4        |   2 | 4                 |
|     501 | 5        |   2 | 1                 |
|     502 | 5        |   2 | 3                 |
|     503 | 5        |   2 | 5                 |
|     601 | 6        |   2 | 2                 |
|     602 | 6        |   2 | 5                 |
|     603 | 6        |   2 | 3                 |
|     604 | 6        |   2 | 3                 |
|     605 | 6        |   2 | 4                 |
|     606 | 6        |   2 | 5                 |
|     607 | 6        |   2 | 4                 |
|     701 | 7        |   2 | 2                 |
|     801 | 8        |   2 | 2                 |
|     802 | 8        |   2 | 3                 |
|     803 | 8        |   2 | 3                 |
|     804 | 8        |   2 | 3                 |
|     805 | 8        |   2 | 5                 |
|     806 | 8        |   2 | 2                 |
| 1010001 | 101      |   3 | NULL              |
| 1010002 | 101      |   3 | NULL              |
| 1010003 | 101      |   3 | NULL              |
| 1020001 | 102      |   3 | NULL              |
| 1020002 | 102      |   3 | NULL              |
| 1020003 | 102      |   3 | NULL              |
| 1020004 | 102      |   3 | NULL              |
| 1020005 | 102      |   3 | NULL              |
| 1030001 | 103      |   3 | NULL              |
| 2010001 | 201      |   3 | NULL              |
| 2010002 | 201      |   3 | NULL              |
| 2010003 | 201      |   3 | NULL              |
| 2010004 | 201      |   3 | NULL              |
| 2010005 | 201      |   3 | NULL              |
| 3010001 | 301      |   3 | NULL              |
| 3010002 | 301      |   3 | NULL              |
| 3010003 | 301      |   3 | NULL              |
| 3010004 | 301      |   3 | NULL              |
| 3020001 | 302      |   3 | NULL              |
| 3020002 | 302      |   3 | NULL              |
| 3020003 | 302      |   3 | NULL              |
| 3020004 | 302      |   3 | NULL              |
| 3020005 | 302      |   3 | NULL              |
| 3030001 | 303      |   3 | NULL              |
| 3040001 | 304      |   3 | NULL              |
| 3040002 | 304      |   3 | NULL              |
| 3050001 | 305      |   3 | NULL              |
| 3050002 | 305      |   3 | NULL              |
| 3050003 | 305      |   3 | NULL              |
| 3050004 | 305      |   3 | NULL              |
| 3060001 | 306      |   3 | NULL              |
| 3060002 | 306      |   3 | NULL              |
| 3060003 | 306      |   3 | NULL              |
| 4010001 | 401      |   3 | NULL              |
| 4010002 | 401      |   3 | NULL              |
| 4010003 | 401      |   3 | NULL              |
| 4020001 | 402      |   3 | NULL              |
| 4030001 | 403      |   3 | NULL              |
| 4030002 | 403      |   3 | NULL              |
| 4040001 | 404      |   3 | NULL              |
| 4040002 | 404      |   3 | NULL              |
| 4050001 | 405      |   3 | NULL              |
| 4050002 | 405      |   3 | NULL              |
| 4050003 | 405      |   3 | NULL              |
| 4050004 | 405      |   3 | NULL              |
| 5010001 | 501      |   3 | NULL              |
| 5020001 | 502      |   3 | NULL              |
| 5020002 | 502      |   3 | NULL              |
| 5020003 | 502      |   3 | NULL              |
| 5030001 | 503      |   3 | NULL              |
| 5030002 | 503      |   3 | NULL              |
| 5030003 | 503      |   3 | NULL              |
| 5030004 | 503      |   3 | NULL              |
| 5030005 | 503      |   3 | NULL              |
| 6010001 | 601      |   3 | NULL              |
| 6010002 | 601      |   3 | NULL              |
| 6020001 | 602      |   3 | NULL              |
| 6020002 | 602      |   3 | NULL              |
| 6020003 | 602      |   3 | NULL              |
| 6020004 | 602      |   3 | NULL              |
| 6020005 | 602      |   3 | NULL              |
| 6030001 | 603      |   3 | NULL              |
| 6030002 | 603      |   3 | NULL              |
| 6030003 | 603      |   3 | NULL              |
| 6040001 | 604      |   3 | NULL              |
| 6040002 | 604      |   3 | NULL              |
| 6040003 | 604      |   3 | NULL              |
| 6050001 | 605      |   3 | NULL              |
| 6050002 | 605      |   3 | NULL              |
| 6050003 | 605      |   3 | NULL              |
| 6050004 | 605      |   3 | NULL              |
| 6060001 | 606      |   3 | NULL              |
| 6060002 | 606      |   3 | NULL              |
| 6060003 | 606      |   3 | NULL              |
| 6060004 | 606      |   3 | NULL              |
| 6060005 | 606      |   3 | NULL              |
| 6070001 | 607      |   3 | NULL              |
| 6070002 | 607      |   3 | NULL              |
| 6070003 | 607      |   3 | NULL              |
| 6070004 | 607      |   3 | NULL              |
| 7010001 | 701      |   3 | NULL              |
| 7010002 | 701      |   3 | NULL              |
| 8010001 | 801      |   3 | NULL              |
| 8010002 | 801      |   3 | NULL              |
| 8020001 | 802      |   3 | NULL              |
| 8020002 | 802      |   3 | NULL              |
| 8020003 | 802      |   3 | NULL              |
| 8030001 | 803      |   3 | NULL              |
| 8030002 | 803      |   3 | NULL              |
| 8030003 | 803      |   3 | NULL              |
| 8040001 | 804      |   3 | NULL              |
| 8040002 | 804      |   3 | NULL              |
| 8040003 | 804      |   3 | NULL              |
| 8050001 | 805      |   3 | NULL              |
| 8050002 | 805      |   3 | NULL              |
| 8050003 | 805      |   3 | NULL              |
| 8050004 | 805      |   3 | NULL              |
| 8050005 | 805      |   3 | NULL              |
| 8060001 | 806      |   3 | NULL              |
| 8060002 | 806      |   3 | NULL              |
+---------+----------+-----+-------------------+

সংযুক্ত শ্রেণিবিন্যাসের পরিবর্তে পুরো পথ তৈরি করা

যদি আমরা কেবলমাত্র পুরো পথের Nস্তরের গভীরতায় আগ্রহী, আমরা বাদ দিতে পারি IDএবং ParentIDসিটিই থেকে। পরিপূরক সারণীতে যদি আমাদের সম্ভাব্য নামের একটি তালিকা থাকে তবে Namesসিটিইতে এই টেবিলটি থেকে তাদের চয়ন করা সহজ। Names3 স্তরের জন্য স্তর 2, 5 1 স্তর, 10 এর জন্য 20;: টেবিল প্রতিটি স্তরের জন্য যথেষ্ট সারি থাকা উচিত 20 + 10 + 5 = 35 মোট। প্রতিটি স্তরের জন্য বিভিন্ন সারির বিভিন্ন সেট থাকা দরকার নেই তবে এটি সঠিকভাবে সেট আপ করা সহজ, তাই আমি এটি করেছি।

DECLARE @Names TABLE (Lvl int, Name nvarchar(4000), SeqNumber int);

-- First level: AAA, BBB, CCC, etc.
INSERT INTO @Names (Lvl, Name, SeqNumber)
SELECT 1, REPLICATE(CHAR(Number+64), 3) AS Name, Number AS SeqNumber
FROM Numbers
WHERE Number <= 20;

-- Second level: 001, 002, 003, etc.
INSERT INTO @Names (Lvl, Name, SeqNumber)
SELECT 2, REPLACE(STR(Number, 3), ' ', '0') AS Name, Number AS SeqNumber
FROM Numbers
WHERE Number <= 10;

-- Third level: I, II, III, IV, V
INSERT INTO @Names (Lvl, Name, SeqNumber) VALUES
(3, 'I',   1),
(3, 'II',  2),
(3, 'III', 3),
(3, 'IV',  4),
(3, 'V',   5);

এসকিউএল ফিডল এখানে চূড়ান্ত ক্যোয়ারী। আমি বিভক্ত FullPathমধ্যে FilePathএবং FileName

WITH
CTE
AS
(
    SELECT 
        TOP(CAST(
            (CAST(CRYPT_GEN_RANDOM(4) as int) / 4294967295.0 + 0.5) * 
            (
                1 + (SELECT I.LvlMax FROM @Intervals AS I WHERE I.Lvl = 1)
                  - (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = 1)
            )
            + (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = 1)
            AS int))

        1 AS Lvl
        ,CAST(
            (CAST(CRYPT_GEN_RANDOM(4) as int) / 4294967295.0 + 0.5) * 
            (
                1 + (SELECT I.LvlMax FROM @Intervals AS I WHERE I.Lvl = 2)
                  - (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = 2)
            )
            + (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = 2)
            AS int) AS ChildRowCount
        ,N.Name AS FullPath
        ,N.Name AS [FilePath]
        ,CAST(N'' AS nvarchar(4000)) AS [FileName]
    FROM
        Numbers
        INNER JOIN @Names AS N ON 
            N.SeqNumber = Numbers.Number AND N.Lvl = 1
    ORDER BY Numbers.Number

    UNION ALL

    SELECT
        CTE.Lvl + 1 AS Lvl
        ,CA.ChildRowCount
        ,CTE.FullPath + '\' + CA.Name AS FullPath

        ,CASE WHEN CA.ChildRowCount IS NOT NULL 
            THEN CTE.FullPath + '\' + CA.Name
            ELSE CTE.FullPath END AS [FilePath]

        ,CASE WHEN CA.ChildRowCount IS NULL 
            THEN CA.Name
            ELSE N'' END AS [FileName]
    FROM
        CTE
        CROSS APPLY
        (
            SELECT
                Numbers.Number
                ,CAST(
                    (CAST(CRYPT_GEN_RANDOM(4) as int) / 4294967295.0 + 0.5) * 
                    (
                    1 + (SELECT I.LvlMax FROM @Intervals AS I WHERE I.Lvl = CTE.Lvl + 2)
                      - (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = CTE.Lvl + 2)
                    )
                    + (SELECT I.LvlMin FROM @Intervals AS I WHERE I.Lvl = CTE.Lvl + 2)
                    AS int) AS ChildRowCount
                ,N.Name
            FROM
                Numbers
                INNER JOIN @Names AS N ON 
                    N.SeqNumber = Numbers.Number AND N.Lvl = CTE.Lvl + 1
            WHERE Numbers.Number <= CTE.ChildRowCount
        ) AS CA
    WHERE
        CTE.ChildRowCount IS NOT NULL
)
SELECT
    CTE.FullPath
    ,CTE.[FilePath]
    ,CTE.[FileName]
FROM CTE
WHERE CTE.ChildRowCount IS NULL
ORDER BY FullPath;

ফলাফল

+-------------+----------+----------+
|  FullPath   | FilePath | FileName |
+-------------+----------+----------+
| AAA\001\I   | AAA\001  | I        |
| AAA\001\II  | AAA\001  | II       |
| AAA\002\I   | AAA\002  | I        |
| AAA\002\II  | AAA\002  | II       |
| AAA\002\III | AAA\002  | III      |
| AAA\002\IV  | AAA\002  | IV       |
| AAA\002\V   | AAA\002  | V        |
| AAA\003\I   | AAA\003  | I        |
| AAA\003\II  | AAA\003  | II       |
| AAA\003\III | AAA\003  | III      |
| AAA\004\I   | AAA\004  | I        |
| AAA\004\II  | AAA\004  | II       |
| AAA\004\III | AAA\004  | III      |
| AAA\004\IV  | AAA\004  | IV       |
| BBB\001\I   | BBB\001  | I        |
| BBB\001\II  | BBB\001  | II       |
| CCC\001\I   | CCC\001  | I        |
| CCC\001\II  | CCC\001  | II       |
| CCC\001\III | CCC\001  | III      |
| CCC\001\IV  | CCC\001  | IV       |
| CCC\001\V   | CCC\001  | V        |
| CCC\002\I   | CCC\002  | I        |
| CCC\003\I   | CCC\003  | I        |
| CCC\003\II  | CCC\003  | II       |
| CCC\004\I   | CCC\004  | I        |
| CCC\004\II  | CCC\004  | II       |
| CCC\005\I   | CCC\005  | I        |
| CCC\005\II  | CCC\005  | II       |
| CCC\005\III | CCC\005  | III      |
| CCC\006\I   | CCC\006  | I        |
| CCC\006\II  | CCC\006  | II       |
| CCC\006\III | CCC\006  | III      |
| CCC\006\IV  | CCC\006  | IV       |
| CCC\007\I   | CCC\007  | I        |
| CCC\007\II  | CCC\007  | II       |
| CCC\007\III | CCC\007  | III      |
| CCC\007\IV  | CCC\007  | IV       |
| CCC\008\I   | CCC\008  | I        |
| CCC\008\II  | CCC\008  | II       |
| CCC\008\III | CCC\008  | III      |
| CCC\009\I   | CCC\009  | I        |
| CCC\009\II  | CCC\009  | II       |
| CCC\009\III | CCC\009  | III      |
| CCC\009\IV  | CCC\009  | IV       |
| CCC\010\I   | CCC\010  | I        |
| CCC\010\II  | CCC\010  | II       |
| CCC\010\III | CCC\010  | III      |
| DDD\001\I   | DDD\001  | I        |
| DDD\001\II  | DDD\001  | II       |
| DDD\001\III | DDD\001  | III      |
| DDD\001\IV  | DDD\001  | IV       |
| DDD\002\I   | DDD\002  | I        |
| DDD\003\I   | DDD\003  | I        |
| DDD\003\II  | DDD\003  | II       |
| DDD\003\III | DDD\003  | III      |
| DDD\003\IV  | DDD\003  | IV       |
| DDD\004\I   | DDD\004  | I        |
| DDD\004\II  | DDD\004  | II       |
| DDD\004\III | DDD\004  | III      |
| DDD\005\I   | DDD\005  | I        |
| DDD\006\I   | DDD\006  | I        |
| DDD\006\II  | DDD\006  | II       |
| DDD\006\III | DDD\006  | III      |
| DDD\007\I   | DDD\007  | I        |
| DDD\007\II  | DDD\007  | II       |
| DDD\008\I   | DDD\008  | I        |
| DDD\008\II  | DDD\008  | II       |
| DDD\008\III | DDD\008  | III      |
| DDD\009\I   | DDD\009  | I        |
| DDD\009\II  | DDD\009  | II       |
| DDD\010\I   | DDD\010  | I        |
| DDD\010\II  | DDD\010  | II       |
| DDD\010\III | DDD\010  | III      |
| DDD\010\IV  | DDD\010  | IV       |
| DDD\010\V   | DDD\010  | V        |
| EEE\001\I   | EEE\001  | I        |
| EEE\001\II  | EEE\001  | II       |
| FFF\001\I   | FFF\001  | I        |
| FFF\002\I   | FFF\002  | I        |
| FFF\002\II  | FFF\002  | II       |
| FFF\003\I   | FFF\003  | I        |
| FFF\003\II  | FFF\003  | II       |
| FFF\003\III | FFF\003  | III      |
| FFF\003\IV  | FFF\003  | IV       |
| FFF\003\V   | FFF\003  | V        |
| FFF\004\I   | FFF\004  | I        |
| FFF\004\II  | FFF\004  | II       |
| FFF\004\III | FFF\004  | III      |
| FFF\004\IV  | FFF\004  | IV       |
| FFF\005\I   | FFF\005  | I        |
| FFF\006\I   | FFF\006  | I        |
| FFF\007\I   | FFF\007  | I        |
| FFF\007\II  | FFF\007  | II       |
| FFF\007\III | FFF\007  | III      |
| GGG\001\I   | GGG\001  | I        |
| GGG\001\II  | GGG\001  | II       |
| GGG\001\III | GGG\001  | III      |
| GGG\002\I   | GGG\002  | I        |
| GGG\003\I   | GGG\003  | I        |
| GGG\003\II  | GGG\003  | II       |
| GGG\003\III | GGG\003  | III      |
| GGG\004\I   | GGG\004  | I        |
| GGG\004\II  | GGG\004  | II       |
| HHH\001\I   | HHH\001  | I        |
| HHH\001\II  | HHH\001  | II       |
| HHH\001\III | HHH\001  | III      |
| HHH\002\I   | HHH\002  | I        |
| HHH\002\II  | HHH\002  | II       |
| HHH\002\III | HHH\002  | III      |
| HHH\002\IV  | HHH\002  | IV       |
| HHH\002\V   | HHH\002  | V        |
| HHH\003\I   | HHH\003  | I        |
| HHH\003\II  | HHH\003  | II       |
| HHH\003\III | HHH\003  | III      |
| HHH\003\IV  | HHH\003  | IV       |
| HHH\003\V   | HHH\003  | V        |
| HHH\004\I   | HHH\004  | I        |
| HHH\004\II  | HHH\004  | II       |
| HHH\004\III | HHH\004  | III      |
| HHH\004\IV  | HHH\004  | IV       |
| HHH\004\V   | HHH\004  | V        |
| HHH\005\I   | HHH\005  | I        |
| HHH\005\II  | HHH\005  | II       |
| HHH\005\III | HHH\005  | III      |
| HHH\005\IV  | HHH\005  | IV       |
| HHH\005\V   | HHH\005  | V        |
| HHH\006\I   | HHH\006  | I        |
| HHH\007\I   | HHH\007  | I        |
| HHH\007\II  | HHH\007  | II       |
| HHH\007\III | HHH\007  | III      |
| HHH\008\I   | HHH\008  | I        |
| HHH\008\II  | HHH\008  | II       |
| HHH\008\III | HHH\008  | III      |
| HHH\008\IV  | HHH\008  | IV       |
| HHH\008\V   | HHH\008  | V        |
+-------------+----------+----------+

আকর্ষণীয় পদ্ধতির :)। আমি এটা পছন্দ করি. সম্পূর্ণতার স্বার্থে, আপনি দয়া করে নম্বর টেবিল (এসকিউএল ফিডল থেকে) তৈরি করতে কোয়েরি যুক্ত করতে পারেন, বা কেবল সিটিইর অংশ হিসাবে সেই ইনলাইনটি অন্তর্ভুক্ত করতে পারেন? তারপরে কারও পক্ষে কেবল অনুলিপি করা এবং আটকানো সহজ। এই উত্তরের জন্য, চূড়ান্ত আউটপুটটি প্রতিটি স্তরের স্তরের 1 থেকে সমস্ত স্তরের 3 স্তরের মানের জন্য সম্পূর্ণ পথ হিসাবে প্রকাশ করা যেতে পারে? আমি মনে করি INNER JOINএটি ফাইনালে উঠবে মাত্র 2 টি SELECT। শেষ পর্যন্ত, প্রতিটি নোডে নাম / লেবেলগুলি বরাদ্দ করা যেতে পারে যাতে সেগুলি কেবল সংখ্যা নয়? আমি উভয় পয়েন্ট পরিষ্কার করতে প্রশ্ন আপডেট করব।
সলোমন রুটজকি

এই নামগুলি / লেবেলগুলি কোথা থেকে এসেছে? আমার কি একটি 'নাম' টেবিল থাকা উচিত, যার 20 টি সারি রয়েছে এবং এটি থেকে কোনও নাম চয়ন করতে হবে? সুতরাং একই স্তরের নাম প্রতিটি স্তরে উপস্থিত হবে। অথবা প্রতিটি স্তরের আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা নাম রাখা উচিত?
ভ্লাদিমির বারানভ

আমি মনে করি সিটিইর অংশ হিসাবে নামগুলি কোনও সারণী (অস্থায়ী, বাস্তব বা পরিবর্তনশীল) থেকে বা ইনলাইন থেকে আসতে পারে। আমি প্রথমে সেগুলিকে সিটিইতে রেখেছি তবে সেগুলি স্থানীয় টেম্প টেবিলের দিকে সরিয়ে নিয়েছি যাতে ক্যোয়ারির মূল অংশটি এখানে আরও পাঠযোগ্য। আমার মনে হয় আপনার যে কাঠামো আছে তা দিয়ে প্রতি স্তরে আলাদা থাকা যথেষ্ট সহজ হবে। তবে যদি এটি কেবলমাত্র 20 এর একটি সেটও যথেষ্ট ছিল তবে এটি পরীক্ষার ডেটাতে কিছুটা কম বৈচিত্র্য সরবরাহ করে। কেবলমাত্র আসল প্রয়োজনীয়তা হ'ল ডিরেক্টরি বা ফাইলগুলি তৈরি করার চেষ্টা করার সময় কোনও নাম নোডের মধ্যে পুনরাবৃত্তি করে না :)
সলোমন রুটজকি

1
@ শ্রুতজকি, আমি একটি দ্বিতীয় রূপটি যুক্ত করেছি।
ভ্লাদিমির বারানভ

1
@srutzky, আমি বিভক্ত FullPathমধ্যে FilePathএবং FileName
ভ্লাদিমির বারানভ

4

আমি এখানে এসেছি তাই এখানে। ডিরেক্টরি কাঠামো তৈরির লক্ষ্য নিয়ে আমি ডিরেক্টরি এবং ফাইলগুলির জন্য ব্যবহারযোগ্য "নাম" সন্ধান করছিলাম। কারণ আমি পেতে অক্ষম ছিল TOP(n)ওয়ার্কিং CROSS APPLY(আমার ধারণা আমি পিতা বা মাতা থেকে একটি মান ব্যবহার করে প্রশ্নের সম্পর্কিত প্রয়াস গুলি nমধ্যে TOP(n)কিন্তু তারপর, এটা র্যান্ডম ছিল না), আমি "সংখ্যার" এক ধরনের তৈরি করার সিদ্ধান্ত নিয়েছে সারণী যা কোনও INNER JOINবা WHEREশর্তকে nউপাদানগুলির একটি সেট উত্পাদন করার অনুমতি দেয় কেবল কোনও সংখ্যার এলোমেলো করে এবং এটি নির্দিষ্ট করে WHERE table.Level = random_number। কৌশলটি হ'ল লেভেল 1 এর জন্য কেবল 1 সারি, স্তর 2 এর জন্য 2 সারি, স্তর 3 এর জন্য 3 টি সারি এবং আরও অনেক কিছু রয়েছে। অতএব, ব্যবহারে WHERE LevelID = 3আমার 3 টি সারি পাবেন এবং প্রতিটি সারিতে একটি মান রয়েছে যা আমি ডিরেক্টরি নাম হিসাবে ব্যবহার করতে পারি।

সেটআপ

এই অংশটি সিটিইর অংশ হিসাবে মূলত ইনলাইনটি নির্দিষ্ট করা হয়েছিল। তবে পঠনযোগ্যতার জন্য (যাতে আপনাকে INSERTসত্যিকারের ক্যোয়ারির কয়েকটি লাইনে পৌঁছানোর জন্য প্রচুর বিবৃতি দিয়ে স্ক্রোল করার দরকার নেই ), আমি এটিকে স্থানীয় অস্থায়ী টেবিলে ভেঙে ফেললাম।

IF (OBJECT_ID(N'tempdb..#Elements') IS NULL)
BEGIN
  PRINT 'Creating #Elements table...';
  CREATE TABLE #Elements (
     ElementLevel TINYINT NOT NULL,
     LevelName NVARCHAR(50) NOT NULL
                         );

  PRINT 'Populating #Elements table...';
  INSERT INTO #Elements (ElementLevel, LevelName)
    SELECT tmp.[Level], tmp.[Name]
    FROM (
                  SELECT 1,  N'Ella'
       UNION ALL  SELECT 2,  N'Itchy'
       UNION ALL  SELECT 2,  N'Scratchy'
       UNION ALL  SELECT 3,  N'Moe'
       UNION ALL  SELECT 3,  N'Larry'
       UNION ALL  SELECT 3,  N'Curly'
       UNION ALL  SELECT 4,  N'Ian'
       UNION ALL  SELECT 4,  N'Stephen'
       UNION ALL  SELECT 4,  N'Peter'
       UNION ALL  SELECT 4,  N'Bernard'
       UNION ALL  SELECT 5,  N'Michigan'
       UNION ALL  SELECT 5,  N'Erie'
       UNION ALL  SELECT 5,  N'Huron'
       UNION ALL  SELECT 5,  N'Ontario'
       UNION ALL  SELECT 5,  N'Superior'
       UNION ALL  SELECT 6,  N'White'
       UNION ALL  SELECT 6,  N'Orange'
       UNION ALL  SELECT 6,  N'Blonde'
       UNION ALL  SELECT 6,  N'Pink'
       UNION ALL  SELECT 6,  N'Blue'
       UNION ALL  SELECT 6,  N'Brown'
       UNION ALL  SELECT 7,  N'Asia'
       UNION ALL  SELECT 7,  N'Africa'
       UNION ALL  SELECT 7,  N'North America'
       UNION ALL  SELECT 7,  N'South America'
       UNION ALL  SELECT 7,  N'Antarctica'
       UNION ALL  SELECT 7,  N'Europe'
       UNION ALL  SELECT 7,  N'Australia'
       UNION ALL  SELECT 8,  N'AA'
       UNION ALL  SELECT 8,  N'BB'
       UNION ALL  SELECT 8,  N'CC'
       UNION ALL  SELECT 8,  N'DD'
       UNION ALL  SELECT 8,  N'EE'
       UNION ALL  SELECT 8,  N'FF'
       UNION ALL  SELECT 8,  N'GG'
       UNION ALL  SELECT 8,  N'HH'
       UNION ALL  SELECT 9,  N'I'
       UNION ALL  SELECT 9,  N'II'
       UNION ALL  SELECT 9,  N'III'
       UNION ALL  SELECT 9,  N'IV'
       UNION ALL  SELECT 9,  N'V'
       UNION ALL  SELECT 9,  N'VI'
       UNION ALL  SELECT 9,  N'VII'
       UNION ALL  SELECT 9,  N'VIII'
       UNION ALL  SELECT 9,  N'IX'
       UNION ALL  SELECT 10, N'Million'
       UNION ALL  SELECT 10, N'Billion'
       UNION ALL  SELECT 10, N'Trillion'
       UNION ALL  SELECT 10, N'Quadrillion'
       UNION ALL  SELECT 10, N'Quintillion'
       UNION ALL  SELECT 10, N'Sestillion'
       UNION ALL  SELECT 10, N'Sextillion'
       UNION ALL  SELECT 10, N'Octillion'
       UNION ALL  SELECT 10, N'Nonillion'
       UNION ALL  SELECT 10, N'Decillion'
     ) tmp([Level], [Name]);
END;

মেইন QUERY

স্তরের 1 এর জন্য আমি কেবলমাত্র [name]মানগুলি কেড়ে নিয়েছি sys.objectsকারণ সেখানে সর্বদা প্রচুর সারি থাকে। তবে, নামগুলির উপরে যদি আমার আরও নিয়ন্ত্রণের প্রয়োজন হয় তবে আমি #Elementsঅতিরিক্ত স্তরগুলি সারণিতে কেবল টেবিলটি প্রসারিত করতে পারি ।

;WITH topdir(Level1, Randy) AS
(
    SELECT TOP ( (CONVERT(INT, CRYPT_GEN_RANDOM(1)) % 20) + 5 ) so.[name],
                ( (CONVERT(INT, CRYPT_GEN_RANDOM(1)) % 10) + 1 )
    FROM sys.objects so
    ORDER BY CRYPT_GEN_RANDOM(8) ASC
)
SELECT  td.Level1, tmp1.Level2, tmp2.Level3
FROM    topdir td
CROSS APPLY (SELECT help.LevelName, (CONVERT(INT, CRYPT_GEN_RANDOM(1)) % 5) + 1
            FROM #Elements help
            WHERE help.ElementLevel = td.Randy
            ) tmp1 (Level2, Bandy)
CROSS APPLY (SELECT help.LevelName
            FROM #Elements help
            WHERE help.ElementLevel = tmp1.Bandy
            ) tmp2 (Level3);

QUERY প্রতিটি ফাইলের পাঠ, নাম এবং বিষয়বস্তু উত্পাদন করতে গৃহীত

ফাইল এবং ফাইল সামগ্রীগুলির পুরো পথ তৈরি করার জন্য, আমি সিটিইর প্রধান এসইএলপিটিকে অন্য একটি সিটিই করেছিলাম এবং একটি নতুন প্রধান এসইএলপি যুক্ত করেছি যা সঠিক আউটপুটগুলিকে কেবল ফাইলগুলিতে যেতে হবে।

DECLARE @Template NVARCHAR(4000);
SET @Template = N'<?xml version="1.0" encoding="ISO-8859-1"?>
<ns0:P4131 xmlns:ns0="http://switching/xi">
<R000000>
    <R00000010>R000000</R00000010>
    <R00000020>I</R00000020>
    <R00000030>{{Tag30}}</R00000030>
    <R00000040>{{Tag40}}</R00000040>
    <R00000050>{{Tag50}}</R00000050>
    <R00000060>2</R00000060>
</R000000>
</ns0:P4131>
';


;WITH topdir(Level1, Thing1) AS
(
    SELECT TOP ( (CONVERT(INT, CRYPT_GEN_RANDOM(1)) % 20) + 5 ) so.[name],
                ( (CONVERT(INT, CRYPT_GEN_RANDOM(1)) % 10) + 1 )
    FROM sys.objects so
    ORDER BY CRYPT_GEN_RANDOM(8) ASC
), main AS
(
   SELECT  td.Level1, tmp1.Level2, tmp2.Level3,
           td.Level1 + N'\' + tmp1.Level2 AS [FullPath],
           RIGHT('000' + CONVERT(VARCHAR(10),
                          (CONVERT(INT, CRYPT_GEN_RANDOM(2)) % 9999) + 1), 4) AS [R30],
           RIGHT('000' + CONVERT(VARCHAR(10),
                          (CONVERT(INT, CRYPT_GEN_RANDOM(2)) % 500) + 100), 4) AS [R50],
           ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS [RowNum]
   FROM    topdir td
   CROSS APPLY (SELECT help.LevelName, (CONVERT(INT, CRYPT_GEN_RANDOM(1)) % 5) + 1
                FROM #Elements help
                WHERE help.ElementLevel = td.Thing1
               ) tmp1 (Level2, Thing2)
   CROSS APPLY (SELECT help.LevelName
                FROM #Elements help
                WHERE help.ElementLevel = tmp1.Thing2
               ) tmp2 (Level3)
)
SELECT  mn.FullPath,
        mn.Level3 + N'.xml' AS [FileName],
        REPLACE(
            REPLACE(
                REPLACE(
                    @Template,
                    N'{{Tag30}}',
                    mn.R30),
                N'{{Tag40}}',
                mn.RowNum),
            N'{{Tag50}}',
            mn.R50) AS [Contents]
FROM    main mn;

অতিরিক্ত ক্রেডিট

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

এই ডেটাটি কার্যক্ষম করার জন্য, আমি নীচে SELECTসরাসরি উপরে প্রদর্শিত সিটিইর মূলটি সংশোধন করেছি :

SELECT  SQL#.File_CreateDirectory(
            N'C:\Stuff\TestXmlFiles\' + mn.FullPath) AS [CreateTheDirectory],
        SQL#.File_WriteFile(
            N'C:\Stuff\TestXmlFiles\' + mn.FullPath + N'\' + mn.Level3 + N'.xml',
            REPLACE(
                REPLACE(
                    REPLACE(
                        @Template,
                        N'{{Tag30}}',
                        mn.R30),
                    N'{{Tag40}}',
                    mn.RowNum),
                N'{{Tag50}}',
                mn.R50), -- @FileData
            0, -- @AppendData
            '' -- @FileEncoding
                            ) AS [WriteTheFile]
FROM    main mn;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.