Създадох нова база данни с две таблици, за да тествам функционалността на 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 файла в таблицата Employees и 1 файл в таблицата GeoCountries. Файлът GeoCountries съдържа центроидни координати по ширина/дължина за 249 държави плюс името на държавата и кода на държавата с ISO 3 знака.
Всеки от служителите има код на държавата. Вече имах готов 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="" />
...
*/
Както можете да видите, кодовете на държавите + lat/long са предварително заредени в променлива $ccc, за да се използва като справочна таблица, но тъй като тези данни са в друга SQL таблица (GeoCountries), те не могат да бъдат намерени в текущия контекст на XQuery, който е свързано с SQL таблица Employees.
Има ли начин да стартирате XQuery с достъп до XML, съхраняван в отделни SQL таблици? Ще трябва да управлявам 100-200 подобни ситуации, ако мигрирам, и трябва да намеря ефективно решение за този проблем.
Няма разлика. Някои класове, напр. Страницата предоставя свойство Context, което връща HttpContext.Current и може да се използва като кратка форма.
- person RBarryYoung   schedule 21.02.2013