Я создал новую базу данных с двумя таблицами для проверки функциональности SQLServer 2008 XML.
Если мне удастся добиться желаемого поведения, мне придется создать около 50 таблиц, а затем импортировать множество XML-файлов для нового проекта.
Моя тестовая среда была создана следующим образом:
create table Employees(
idEmployeeFeed bigint primary key IDENTITY(1,1),
EmployeeFeed xml
)
go
create table GeoCountries(
CountriesFeed xml
)
go
Затем я загрузил около 1000 xml-файлов в таблицу «Сотрудники» и 1 файл в таблицу «GeoCountries». Файл GeoCountries содержит координаты центроида широты и долготы для 249 стран, а также название страны и код страны, состоящий из 3 символов ISO.
У каждого сотрудника есть код страны. У меня уже был готовый XQuery в другом продукте, и теперь мне нужно перейти на SQL Server по требованию клиента.
Примеры данных из двух таблиц, полученных с помощью XQuery:
select EmployeeFeed.query('//employee') as employee
from Employees
/* output:
<employee empID="1111" >
<displayName>John</displayName>
<country code="USA" />
</employee>
<employee empID="2222" >
<displayName>Mario</displayName>
<country code="ITA" />
</employee>
...
*/
select EmployeeFeed.query('//employee/country') as employee
from Employees
/* output:
<country code="USA" />
<country code="ITA" />
...
*/
select CountriesFeed.query('//country')
from GeoCountries
/* output:
<country>
<ISO3166A3>USA</ISO3166A3>
<ISOen_name>United States</ISOen_name>
<latitude>38.000</latitude>
<longitude>-97.000</longitude>
</country>
<country>
<ISO3166A3>ITA</ISO3166A3>
<ISOen_name>Italy</ISOen_name>
<latitude>42.833</latitude>
<longitude>12.833</longitude>
</country>
...
*/
select CountriesFeed.query('//country/ISO3166A3')
from GeoCountries
/* output:
<ISO3166A3>USA</ISO3166A3>
<ISO3166A3>ITA</ISO3166A3>
...
*/
Это запрос, который я пытаюсь запустить:
select EmployeeFeed.query(N'
let $ccc := //country
let $ttt := //employee
for $t in $ttt
return
<geoEmp
empCode="{ $t/@empID }"
countryCode="{ $t/country/@code }"
latit="{ $ccc[ISO3166A3 = $t/country/@code]/latitude/text() }"
longit="{ $ccc[ISO3166A3 = $t/country/@code]/longitude/text() }"
/>
') as GeoEmployees
from Employees
/* output:
<geoEmp empCode="1111" countryCode="USA" latit="" longit="" />
<geoEmp empCode="2222" countryCode="ITA" latit="" longit="" />
...
*/
Как видите, коды стран + широта/долгота предварительно загружены в переменную $ccc, чтобы использовать ее в качестве таблицы поиска, но поскольку эти данные находятся в другой таблице SQL (GeoCountries), их нельзя найти в текущем контексте XQuery, который привязан к таблице SQL Employees.
Есть ли способ запустить XQuery для доступа к XML, хранящемуся в отдельных таблицах SQL? Если я мигрирую, у меня будет 100-200 подобных ситуаций, и мне нужно найти эффективное решение этой проблемы.