आपके मूल दृष्टिकोण में दो चीजें गलत थीं।
- टेबल में डालने पर यह गारंटी कभी नहीं दी गई कि
ORDER BY
INSERT ... SELECT ... ORDER BY
यह क्रम होगा कि पंक्तियों को वास्तव में डाला गया था। - इससे चुनने पर SQL सर्वर गारंटी नहीं देता कि
SELECT
बिनाORDER BY
. के किसी भी विशेष क्रम में पंक्तियों को वापस कर देगा जैसे कि सम्मिलन क्रम वैसे भी।
2012 में ऐसा लगता है कि आइटम 1 के संबंध में व्यवहार बदल गया है। अब यह आम तौर पर ORDER BY
पर ध्यान नहीं देता है। SELECT
पर कथन जो एक INSERT
. का स्रोत है
DECLARE @T TABLE(number int)
INSERT INTO @T
SELECT number
FROM master..spt_values
ORDER BY name
2008 योजना
2012 योजना
व्यवहार में बदलाव का कारण यह है कि पिछले संस्करणों में SQL सर्वर ने एक योजना तैयार की थी जिसे SET ROWCOUNT 0
के साथ निष्पादन के बीच साझा किया गया था। (बंद) और SET ROWCOUNT N
. सॉर्ट ऑपरेटर केवल सही शब्दार्थ को सुनिश्चित करने के लिए मौजूद था, यदि योजना एक गैर-शून्य ROWCOUNT
सत्र द्वारा चलाई गई थी समूह। TOP
इसके बाईं ओर ऑपरेटर एक ROWCOUNT TOP
।
SQL सर्वर 2012 अब दो मामलों के लिए अलग-अलग योजनाएँ तैयार करता है, इसलिए इन्हें ROWCOUNT 0
में जोड़ने की कोई आवश्यकता नहीं है योजना का संस्करण।
2012 में योजना में अभी भी एक प्रकार दिखाई दे सकता है यदि SELECT
एक स्पष्ट TOP
है परिभाषित (TOP 100 PERCENT
. के अलावा) ) लेकिन यह अभी भी पंक्तियों के वास्तविक सम्मिलन क्रम की गारंटी नहीं देता है, फिर योजना में TOP N
के बाद एक और प्रकार हो सकता है उदाहरण के लिए पंक्तियों को संकुल अनुक्रमणिका क्रम में लाने के लिए स्थापित किया गया है।
आपके प्रश्न में उदाहरण के लिए मैं केवल ORDER BY name
निर्दिष्ट करने के लिए कॉलिंग कोड समायोजित करूंगा अगर इसकी यही आवश्यकता है।
आपके sort_id
. के संबंध में एसक्यूएल सर्वर में गारंटी ऑर्डर करना
से आईडिया IDENTITY
. के साथ तालिका में डालने पर इसकी गारंटी दी जाती है कि इन्हें आवंटित किया गया आदेश ORDER BY
. के अनुसार होगा तो आप भी कर सकते हैं
DECLARE @Customer TABLE (
Sort_Id INT IDENTITY PRIMARY KEY,
Customer_ID INT,
Name INT,
Expired BIT )
INSERT INTO @Customer
SELECT Customer_ID,
Name,
CASE
WHEN Expiry_Date < Getdate() THEN 1
WHEN Expired = 1 THEN 1
ELSE 0
END
FROM Customer
ORDER BY Name
लेकिन आपको अभी भी sort_id
. द्वारा ऑर्डर करना होगा आपके चयन प्रश्नों में क्योंकि इसके बिना कोई गारंटीकृत आदेश नहीं है (शायद यह sort_id
दृष्टिकोण उस मामले में उपयोगी हो सकता है जहां ऑर्डर करने के लिए उपयोग किए जाने वाले मूल कॉलम तालिका चर में कॉपी नहीं किए जा रहे हैं)