जैसा कि मुझे संदेह था, दूसरा लड़का गलत था, इसलिए मैं अपने स्वयं के प्रश्न का उत्तर देने जा रहा हूँ।
SQL सर्वर 2012 (और शायद पहले के संस्करणों) में, मैंने पाया कि अगर मैं 'सेट शोप्लान_एक्सएमएल ऑन;' कहता हूं। एक मनमाना प्रश्न पर जैसे:
select * from (select * from Lessons a) a inner join (select * from LessonTypes b) b on a.LessonTypeID = b.ID;
लौटाए गए एक्सएमएल में निम्नलिखित को इसकी पहली/शीर्ष-स्तरीय आउटपुटलिस्ट के रूप में शामिल किया गया है, जो स्पष्ट रूप से सभी कॉलम दिखाता है, न केवल उनके स्रोत टेबल बल्कि उनके स्रोत सबक्वायरी के उपनाम।
<OutputList>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="ID"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Name"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Description"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Enabled"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="LessonTypeID"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[LessonTypes]" Alias="[b]" Column="ID"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[LessonTypes]" Alias="[b]" Column="Name"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[LessonTypes]" Alias="[b]" Column="Description"/>
</OutputList>
इसलिए, मेरे डेटाबेस एपीआई में, चूंकि मैं सभी क्वेरी स्ट्रिंग्स को एक शब्दकोश में बड़े करीने से संग्रहीत करता हूं, मैं वास्तव में एप्लिकेशन स्टार्ट पर कैश वार्म-अप कर सकता हूं जो उन सभी को xml_showplan के साथ चलाता है, एक्सएमएल के शीर्ष-स्तरीय आउटपुट कॉलम को पार्स करता है, और फिर तालिका उपनाम और स्तंभ नामों का उनके आउटपुट क्रम में पूर्ण मानचित्रण करें।
दरअसल, मैंने यहां एक छोटी सी ट्रिक का इस्तेमाल किया है। यह वास्तव में उपश्रेणी का उपनाम नहीं है, बल्कि आधार तालिका का उपनाम है। यदि आप आधार तालिका पर उपनाम शामिल नहीं करते हैं, तो उपनाम विशेषता एक्सएमएल में मौजूद नहीं है। हालांकि, यह सुनिश्चित करना बहुत आसान है कि हर बार जब आप किसी वास्तविक तालिका का संदर्भ देते हैं, तो आप इसे एक उपनाम देते हैं, जिससे यह एक्सएमएल में आउटपुट हो, और वहां आप जाते हैं।
बस बिंदु घर चलाने के लिए, उपनाम चिपक जाते हैं, यहां तक कि तालिका में खुद से जुड़ने पर भी:
select * from Lessons a, Lessons b, Lessons c
, जो उत्पादन करता है:
<OutputList>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="ID"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Name"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Description"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="Enabled"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[a]" Column="LessonTypeID"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="ID"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="Name"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="Description"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="Enabled"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[b]" Column="LessonTypeID"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="ID"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="Name"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="Description"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="Enabled"/>
<ColumnReference Database="[sensitive]" Schema="[dbo]" Table="[Lessons]" Alias="[c]" Column="LessonTypeID"/>
</OutputList>
तो जैसा कि आप देख सकते हैं, उपनाम वास्तव में बरकरार हैं और पुनर्प्राप्त करने योग्य हैं।