假设我有从数据库中读取POCO实体和他们每个人都有“身份证”作为自己的主键列名。
如果从一个以上的表或子查询与别名选择a和b等select a.*, b.* from a, b
,则选定列将包括两个ID列(a.ID和b.ID),但源表/子查询的别名都将丢失。 我想知道是否有保留或动态获得这样的顶级别名任意选择查询的输出列的来源方式。
我知道我可以改变输出列名或按顺序访问它们,但我需要他们原始的名字+源表/子查询的别名来访问列,如“a.ID”和“b.ID”。
SqlDataReader的似乎默认不保存的列基表的信息,决不保留别名信息。
有没有办法来区分在这些SqlDataReader的列或让它保持各列的源表/子查询的别名?
类似的问题在这里问: 与在C#中的SqlConnection同名2 SQL列名之间的区别 ,但得到的答复是给列唯一的别名,这不是我想要的。 我希望能够使用一个表的别名,同时保留原来的列名。
在这里问: 如何从SqlDataReader的列的表名 ,在这里回答: https://stackoverflow.com/a/3111208/88409 ,但他们提到,它不会返回表的别名,只有原来的基地台,其中是无用的别名使用子查询。
更新:看来这不能这样做。 一说是没有答案的,但它实际上回答链接到一个问题的问题: 获取表模式从查询似乎别名是像“源代码”的查询,并且它们在编译/优化过程中剥离,从而只有真正的表信息留在最后。
另一个人是错的,因为我怀疑,所以我要回答我的问题。
在SQL Server 2012中(也许更早版本),我发现,如果我称之为“设置SHOWPLAN_XML上;” 在任意的查询,如:
select * from (select * from Lessons a) a inner join (select * from LessonTypes b) b on a.LessonTypeID = b.ID;
返回的XML包括以下作为其第一个/顶层OutputList,其清楚地示出的所有列,并且不仅它们的源表,但它们的源子查询的别名。
<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>
所以,在我的数据库API,因为我整齐地存储所有的查询串在字典中,我可以实际执行的应用程序开始运行他们都通过与xml_showplan缓存热身,解析个XML顶级输出列,然后有表的别名和列名其输出顺序的完整映射。
其实,我在这里使用的小窍门。 这不是真正的子查询的别名,但基表的别名。 如果不包括基表的别名,则别名属性不存在于XML。 然而,这是很简单的,以确保每一个你引用实际的表的时候,你给它一个别名,应该使其输出到XML和你去那里。
只是为了推动点回家,别名棒,在查询中如加入表本身甚至当:
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>
所以你可以看到,别名其实都是完整和检索。
文章来源: How to differentiate duplicate column names from different source tables/subqueries by alias in an SQL select statement when using SqlDataReader?