INSERT INTO এবং WITH / CTE এর সংমিশ্রণ


157

আমার একটি খুব জটিল সিটিই রয়েছে এবং আমি ফলাফলটি একটি ভৌত ​​টেবিলে sertোকাতে চাই।

নিম্নলিখিত বৈধ?

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos 
(
    BatchID,
    AccountNo,
    APartyNo,
    SourceRowID
)       
WITH tab (
  -- some query
)    
SELECT * FROM tab

আমি এই সিটিই তৈরি করতে একটি ফাংশন ব্যবহার করার কথা ভাবছি যা আমাকে পুনরায় ব্যবহারের অনুমতি দেবে। কোন চিন্তা?

উত্তর:


271

আপনাকে প্রথমে সিটিই লাগাতে হবে এবং তারপরে আপনার সিলেক্ট স্টেটমেন্টের সাথে ইনসার্ট ইনটোর সমন্বয় করতে হবে। এছাড়াও, সিটিইর নাম অনুসারে "এএস" কীওয়ার্ডটি alচ্ছিক নয়:

WITH tab AS (
    bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)  
SELECT * FROM tab

দয়া করে নোট করুন যে কোডটি ধরে নিয়েছে যে সিটিই ঠিক চারটি ক্ষেত্র প্রত্যাবর্তন করবে এবং সেই ক্ষেত্রগুলি ক্রমে মিলছে এবং INSERT বিবৃতিতে উল্লিখিতগুলির সাথে টাইপ করে। যদি এটি না হয়, কেবলমাত্র আপনার প্রয়োজনীয় ক্ষেত্রগুলির একটি নির্দিষ্ট নির্বাচনের সাথে "নির্বাচন করুন" প্রতিস্থাপন করুন।

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

সাধারণ_সারণযোগ্য_প্রকাশের সাথে (লেনদেন-এসকিউএল)


19

দ্য WITHজন্য সাধারণ ছক প্রকাশ দফা উপরের যান।

সিটিইতে প্রতিটি inোকানো মোড়ক দেওয়ার জন্য কলাম ম্যাপিং থেকে কোয়েরি যুক্তিটি দৃশ্যত পৃথক করার সুবিধা রয়েছে।

ভুল স্পট:

WITH _INSERT_ AS (
  SELECT
    [BatchID]      = blah
   ,[APartyNo]     = blahblah
   ,[SourceRowID]  = blahblahblah
  FROM Table1 AS t1
)
INSERT Table2
      ([BatchID], [SourceRowID], [APartyNo])
SELECT [BatchID], [APartyNo], [SourceRowID]   
FROM _INSERT_

একই ভুল:

INSERT Table2 (
  [BatchID]
 ,[SourceRowID]
 ,[APartyNo]
)
SELECT
  [BatchID]      = blah
 ,[APartyNo]     = blahblah
 ,[SourceRowID]  = blahblahblah
FROM Table1 AS t1

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


3
এটা অসাধারণ! হঠাৎ করে, আমি INSERT বিবৃতিগুলিকে ততটা ঘৃণা করি না ...
এনআরিলিংহ

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

16

হাঁ:

WITH tab (
  bla bla
)

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (  BatchID,                                                        AccountNo,
APartyNo,
SourceRowID)    

SELECT * FROM tab

নোট করুন যে এটি এসকিউএল সার্ভারের জন্য, যা একাধিক সিটিই সমর্থন করে:

WITH x AS (), y AS () INSERT INTO z (a, b, c) SELECT a, b, c FROM y

টেরাদাতা কেবল একটি সিটিইর অনুমতি দেয় এবং বাক্য গঠনটি আপনার উদাহরণ হিসাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.