XML в MS SQL Server 2000 и технологиях доступа к данным
Страница 8. Прямые XPath-запросы к объектам SQL Server


Прямые XPath-запросы к объектам SQL Server

В Скрипте 7 было показано, как осуществлять XPath-навигацию по связанным таблицам в ADO.Net Dataset. Подобным же образом XPath-запросы можно адресовать к SQL Server 2000, как если бы это был XML-ресурс, а не сервер реляционных баз данных. Под словом "прямые" подразумевается, что эти запросы обращаются к объектам базы данных напрямую, а не через аннотированные схемы, о которых речь пойдет в следующем параграфе. В Скрипте 9 приведен запрос, выводящий всех клиентов с именами, начинающимися с букв X, Y, Z.

static void Direct_XPathQuery_SQLXML()
{
   SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLOLEDB;...");
   cmd.CommandText = "Customers[@ContactName>=$НачБуква]/@ContactName";
   cmd.CommandType = SqlXmlCommandType.XPath;
   SqlXmlParameter prm = cmd.CreateParameter();
   prm.Name = "@НачБуква"; prm.Value = "X";
   cmd.RootTag = "Root";
   XmlDocument xml = new XmlDocument();
   xml.Load(cmd.ExecuteStream());
...
}

 

Скрипт 9

Обратите внимание на разное именование параметра в XPath-запросе и в параметрах объекта команды. Если посмотреть, во что XPath превращается на сервере:

exec sp_executesql N' SELECT ContactName FROM Customers WHERE ContactName>=@НачБуква ', N'@НачБуква nvarchar(1)', N'X',

то видно, что первая @ автоматически получается из $ при переводе XPath-запроса в SQL, а о второй нужно позаботиться самим в приложении (SqlXmlParameter.Name), иначе sp_executesql его попросту не поймет.

Кроме того, из результатов видно, что возвращать нормальный XML в ответ на прямой XPath-запрос SQL Server не умеет - результатом может быть только скалярная строка - например, одно поле единственной записи recordset'a. Если записей, паче чаяния, оказывается несколько, строки конкатенируются в одну. Прямые запросы исповедуют стандартную схему: таблицы воспринимаются как элементы, а поля - как атрибуты. Эти и другие серьезные ограничения наводят на мысль о том, что нужен специальный механизм, позволяющий задавать XML-представление над объектами базы данных, подобно тому, что мы наблюдали в случае ADO.Net DataSet (см. пред. параграф). В SQL Server такая возможность тоже существует и называется "аннотированные схемы".

 
« Предыдущая статья   Следующая статья »