Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

टेबल-वैल्यूड फंक्शन - ऑर्डर बाय आउटपुट में नजरअंदाज किया जाता है

आपके मूल दृष्टिकोण में दो चीजें गलत थीं।

  1. टेबल में डालने पर यह गारंटी कभी नहीं दी गई कि ORDER BY INSERT ... SELECT ... ORDER BY यह क्रम होगा कि पंक्तियों को वास्तव में डाला गया था।
  2. इससे चुनने पर 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 दृष्टिकोण उस मामले में उपयोगी हो सकता है जहां ऑर्डर करने के लिए उपयोग किए जाने वाले मूल कॉलम तालिका चर में कॉपी नहीं किए जा रहे हैं)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टी-एसक्यूएल का उपयोग करके, स्ट्रिंग से nth सीमांकित तत्व लौटाएं

  2. SQL सर्वर:GETDATE द्वारा उत्सुक ()

  3. रिकर्सन को निश्चित स्तर तक सीमित करना - डुप्लिकेट पंक्तियां

  4. मैं वर्तमान तिथि से पिछले 12 महीनों को कैसे प्राप्त कर सकता हूं और पिछले महीने की पहली तारीख तक अतिरिक्त दिन कैसे प्राप्त कर सकता हूं?

  5. किसी भी JSON को SQL सर्वर में की-वैल्यू पेयर (EAV फॉर्मेट) की सूची में पढ़ें