Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да различа дублиращите се имена на колони от различни изходни таблици/подзаявки по псевдоним в оператор за избор на SQL, когато използвате SqlDataReader?

Другият човек не беше прав, както подозирах, така че ще отговоря на собствения си въпрос.

В SQL Server 2012 (и вероятно по-ранни версии) открих, че ако извикам „set showplan_xml on;“ на произволна заявка като:

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 и след това имат пълно съпоставяне на псевдоними на таблици и имена на колони към техния изходящ ред.

Всъщност използвах малък трик тук. Това всъщност не е псевдонимът на подзаявката, а псевдонимът на основната таблица. Ако не включите псевдоним в основната таблица, тогава атрибутът Alias ​​не присъства в 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>

Така че, както можете да видите, псевдонимите всъщност са непокътнати и могат да бъдат възстановени.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какви са основните разлики в производителността между varchar и nvarchar типовете данни на SQL Server?

  2. SQL Server сортира разделени със запетая низове в една колона

  3. Как да създам колона, изчислена от друга колона?

  4. Как да заменя (нула) стойности с 0 изход в PIVOT

  5. Как ROW_NUMBER() работи в SQL Server