आप निम्नानुसार स्पष्ट आदेश निर्दिष्ट करने से बच सकते हैं:
INSERT dbo.TargetTable (ID, FIELD)
SELECT
Row_Number() OVER (ORDER BY (SELECT 1))
+ Coalesce(
(SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)),
0
),
FieldValue
FROM dbo.SourceTable
WHERE {somecondition};
हालांकि, कृपया ध्यान दें कि यह केवल एक आदेश निर्दिष्ट करने से बचने का एक तरीका है और गारंटी नहीं देता कि किसी भी मूल डेटा ऑर्डरिंग को संरक्षित किया जाएगा। ऐसे अन्य कारक हैं जो परिणाम को आदेशित करने का कारण बन सकते हैं, जैसे ORDER BY
बाहरी क्वेरी में। इसे पूरी तरह से समझने के लिए, किसी को यह महसूस करना चाहिए कि "आदेश नहीं दिया गया (एक विशेष तरीके से)" अवधारणा "मूल आदेश बनाए रखना" (जिसे एक विशेष तरीके से आदेश दिया गया है!) के समान नहीं है। मेरा मानना है कि एक शुद्ध संबंधपरक डेटाबेस परिप्रेक्ष्य से, बाद की अवधारणा अस्तित्व में नहीं है , परिभाषा के अनुसार (यद्यपि ऐसे डेटाबेस कार्यान्वयन हो सकते हैं जो इसका उल्लंघन करते हैं, SQL सर्वर उनमें से एक नहीं है)।
लॉक संकेतों का कारण उस मामले को रोकना है जहां कुछ अन्य प्रक्रिया उस मूल्य का उपयोग करके सम्मिलित होती है जिसे आप उपयोग करने की योजना बना रहे हैं, क्वेरी निष्पादन के कुछ हिस्सों के बीच।
नोट:बहुत से लोग (SELECT NULL)
. का उपयोग करते हैं "विंडोिंग फ़ंक्शन के खंड द्वारा ऑर्डर में अनुमति नहीं है" प्रतिबंध के आसपास पाने के लिए। किसी कारण से, मुझे पसंद है 1
NULL
. से अधिक ।
साथ ही:मुझे लगता है कि एक पहचान कॉलम बहुत बेहतर है और इसके बजाय इसका इस्तेमाल किया जाना चाहिए। समेकन के लिए संपूर्ण तालिकाओं को विशेष रूप से लॉक करना अच्छा नहीं है। अंडरस्टेटमेंट।