आप नई तालिका को एक बार में बनाने और आबाद करने के लिए एक प्रयोग का उपयोग कर सकते हैं:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
की वजह से 1 = 0
हालत, दाईं ओर कोई मेल नहीं होगा और इस तरह बाईं ओर पंक्तियों के दोहराव को रोकने, और क्योंकि यह एक बाहरी में शामिल होने है, बाईं ओर पंक्तियों या तो समाप्त नहीं किया जाएगा। अंत में, क्योंकि यह एक सम्मिलित है, इसलिए पहचान की संपत्ति समाप्त हो गई है।
इसलिए, केवल बाईं ओर के स्तंभों का चयन करना, केवल dbo.TableWithIdentity डेटा-वार की एक सटीक प्रतिलिपि का उत्पादन करेगा , यानी IDENTITY संपत्ति के साथ छीन लिया जाएगा।
कहा जा रहा है कि मैक्स वर्नोन ने एक टिप्पणी में एक वैध बिंदु उठाया है जो ध्यान में रखने योग्य है। यदि आप उपरोक्त क्वेरी के निष्पादन योजना को देखते हैं:
आप देखेंगे कि स्रोत तालिका का क्रियान्वयन योजना में सिर्फ एक बार किया गया है। अन्य उदाहरण को आशावादी द्वारा समाप्त कर दिया गया है।
इसलिए, यदि ऑप्टिमाइज़र सही ढंग से यह स्थापित कर सकता है कि योजना में शामिल होने के दाईं ओर की आवश्यकता नहीं है, तो यह अपेक्षा करना उचित होगा कि SQL सर्वर के भविष्य के संस्करण में यह पता लगाने में सक्षम हो सकता है कि पहचान की संपत्ति की आवश्यकता नहीं है या तो हटा दिया गया है, क्योंकि क्वेरी योजना के अनुसार स्रोत पंक्ति में कोई अन्य पहचान स्तंभ नहीं है। इसका मतलब है कि उपरोक्त क्वेरी कुछ बिंदु पर अपेक्षित रूप से काम करना बंद कर सकती है।
लेकिन, जैसा कि ypercubeᵀᴹ द्वारा सही ढंग से नोट किया गया है , अब तक मैनुअल स्पष्ट रूप से कह रहा है कि यदि कोई सम्मिलित है , तो पहचान की संपत्ति संरक्षित नहीं है:
जब एक मौजूदा पहचान कॉलम को एक नई तालिका में चुना जाता है, तो नया कॉलम IDENTITY संपत्ति का वारिस करता है, जब तक कि [...] [t] वह चयन कथन में सम्मिलित न हो।
इसलिए, जब तक मैनुअल इसका उल्लेख करता रहता है, हम शायद इस बात पर निश्चिंत हो सकते हैं कि व्यवहार वही रहेगा।
चैट में संबंधित विषय को लाने के लिए कुडोस से शेनिस और ypercube bringing।
JOIN (SELECT 1) AS dummy ON 1 = 1
काम करते हैं, भी?