В Скрипте 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 такая возможность тоже существует и называется "аннотированные схемы".