Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
При помощи предложения FOR XML в SQL-запросах можно получать и даже преобразовывать результаты запросов в формат XML. Эта функция позволяет выполнять следующие задачи, когда результаты запроса FOR XML могут использоваться в коде XML приложения:
Запрос таблиц SQL для экземпляров значений XML Data (SQL Server)
Применить директиву TYPE в запросах FOR XML, чтобы вернуть результат запросов, содержащих текстовые или графические данные, в формате XML.
В этой статье приведены примеры, демонстрирующие эти подходы.
Получение данных FOR XML с помощью островов данных ADO и XML
Объект ADO Stream или другие объекты, поддерживающие интерфейс COM IStream, например объекты запросов и ответов Active Server Pages (ASP), можно использовать для содержания результатов при работе с запросами FOR XML.
Например, в следующем коде ASP показаны результаты запроса столбца типа данных XML , демографических данных в Sales.Store
таблице примера базы данных AdventureWorks. В частности, запрос производит поиск значения столбца для строки, в которой значение CustomerID равно 3.
<!-- BeginRecordAndStreamVBS -->
<%@ LANGUAGE = VBScript %>
<!-- % Option Explicit % -->
<!-- 'Request.ServerVariables("SERVER_NAME") & ";" & _ -->
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Developer Studio"/>
<META HTTP-EQUIV="Content-Type" content="text/html"; charset="iso-8859-1">
<TITLE>FOR XML Query Example</TITLE>
<STYLE>
BODY
{
FONT-FAMILY: Tahoma;
FONT-SIZE: 8pt;
OVERFLOW: auto
}
H3
{
FONT-FAMILY: Tahoma;
FONT-SIZE: 8pt;
OVERFLOW: auto
}
</STYLE>
<!-- #include file="adovbs.inc" -->
<%
Response.Write "<H3>Server-side processing</H3>"
Response.Write "Page Generated @ " & Now() & "<BR/>"
Dim adoConn
Set adoConn = Server.CreateObject("ADODB.Connection")
Dim sConn
sConn = "Provider=SQLOLEDB;Data Source=(local);" & _
"Initial Catalog=AdventureWorks;Integrated Security=SSPI;"
Response.write "Connect String = " & sConn & "<BR/>"
adoConn.ConnectionString = sConn
adoConn.CursorLocation = adUseClient
adoConn.Open
Response.write "ADO Version = " & adoConn.Version & "<BR/>"
Response.write "adoConn.State = " & adoConn.State & "<BR/>"
Dim adoCmd
Set adoCmd = Server.CreateObject("ADODB.Command")
Set adoCmd.ActiveConnection = adoConn
Dim sQuery
sQuery = "<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'><sql:query>SELECT Demographics from Sales.Store WHERE CustomerID = 3 FOR XML AUTO</sql:query></ROOT>"
Response.write "Query String = " & sQuery & "<BR/>"
Dim adoStreamQuery
Set adoStreamQuery = Server.CreateObject("ADODB.Stream")
adoStreamQuery.Open
adoStreamQuery.WriteText sQuery, adWriteChar
adoStreamQuery.Position = 0
adoCmd.CommandStream = adoStreamQuery
adoCmd.Dialect = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Response.write "Pushing XML to client for processing " & "<BR/>"
adoCmd.Properties("Output Stream") = Response
Response.write "<XML ID='MyDataIsle'>"
adoCmd.Execute , , 1024
Response.write "</XML>"
%>
<SCRIPT language="VBScript" For="window" Event="onload">
Dim xmlDoc
Set xmlDoc = MyDataIsle.XMLDocument
Dim root
Set root = xmlDoc.documentElement.childNodes.Item(0).childNodes.Item(0).childNodes.Item(0)
For each child in root.childNodes
dim OutputXML
OutputXML = document.all("log").innerHTML
document.all("log").innerHTML = OutputXML & "<LI><B>" & child.nodeName & ":</B> " & child.Text & "</LI>"
Next
MsgBox xmlDoc.xml
</SCRIPT>
</HEAD>
<BODY>
<H3>Client-side processing of XML Document MyDataIsle</H3>
<UL id=log>
</UL>
</BODY>
</HTML>
<!-- EndRecordAndStreamVBS -->
Этот пример ASP-страницы содержит работающий на стороне сервера скрипт VBScript, выполняющий запрос FOR XML через ADO и возвращающий результат в виде острова XML-данных с именем MyDataIsle. Затем этот остров XML-данных возвращается браузеру и подвергается дополнительной обработке на стороне клиента После этого на стороне клиента дополнительный код скрипта VBScript используется для обработки содержимого острова XML-данных. После этого этапа обработки содержимое отображается в виде результирующего DHTML и открывается окно сообщения, где отображается обработанное содержимое острова XML-данных.
Тестирование этого примера
Убедитесь, что IIS установлен, а также что установлена примерная база данных AdventureWorks для SQL Server.
Данному примеру требуются службы IIS версии 5.0 или более поздней, с включенной поддержкой ASP. Кроме того, необходимо установить образец базы данных AdventureWorks.
Скопируйте код приведенного выше примера и вставьте его в редактор текста или XML. Сохраните файл под именем RetrieveResults.asp в корневой каталог, используемый IIS. Обычно это каталог «C:\Inetpub\wwwroot».
Откройте страницу ASP в окне браузера, указав следующий URL-адрес. Сначала замените MyServer на localhost или фактическое имя сервера, на котором установлены SQL Server и IIS.
https://MyServer/RetrieveResults.asp
Результаты, сформированные в виде страниц HTML, будут выглядеть следующим образом:
Обработка на стороне сервера
Page Generated @ 3/11/2006 3:36:02 PM
Connect String = Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=AdventureWorks;Integrated Security=SSPI;
ADO Version = 2.8
adoConn.State = 1
Query String = SELECT Demographics from Sales.Store WHERE CustomerID = 3 FOR XML AUTO
Pushing XML to client for processing
Обработка XML-документа MyDataIsle на стороне клиента
AnnualSales: 1500000
AnnualRevenue: 150000
BankName: Primary International
Тип бизнеса: ОС
YearOpened: 1974
Специальность: Дорога
SquareFeet: 38000
Brands: 3
Internet: DSL
NumberEmployees: 40
Затем окно сообщения VBScript отобразит следующее содержимое исходного, нефильтрованного массива XML-данных, который был возвращен по запросу FOR XML.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Sales.Store>
<Demographics>
<StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey">
<AnnualSales>1500000</AnnualSales>
<AnnualRevenue>150000</AnnualRevenue>
<BankName>Primary International</BankName>
<BusinessType>OS</BusinessType>
<YearOpened>1974</YearOpened>
<Specialty>Road</Specialty>
<SquareFeet>38000</SquareFeet>
<Brands>3</Brands>
<Internet>DSL</Internet>
<NumberEmployees>40</NumberEmployees>
</StoreSurvey>
</Demographics>
</Sales.Store>
</ROOT>
Получение данных FOR XML с помощью ASP.NET и платформы .NET Framework
Как и в предыдущем примере, код ASP.NET отображает результаты запроса столбца Demographics типа xml из таблицы Sales.Store в образце базы данных AdventureWorks. Как и в предыдущем случае, запрос ищет значение этого столбца, соответствующее строке, в которой CustomerID равен значению 3.
В этом примере используются следующие управляемые API Microsoft .NET Framework для возвращения и отображения результатов запроса FOR XML.
Соединение с SQL Server производится черезSqlConnection по строке соединения, содержащейся в символьной переменной, strConn.
После этогоSqlDataAdapter , используя соединение SQL и указанную строку SQL-запроса, выполняет запрос FOR XML.
После выполнения запроса вызывается метод SqlDataAdapter.Fill , который передает экземпляр DataSet, MyDataSet, чтобы заполнить набор данных результатами выполнения запроса FOR XML.
Затем вызывается метод DataSet.GetXml , который возвращает результаты запроса в виде строки, отображаемой на странице HTML, формируемой на сервере.
<%@ Page Language="VB" %> <HTML> <HEAD> <TITLE>FOR XML Query Example</TITLE> <STYLE> BODY { FONT-FAMILY: Tahoma; FONT-SIZE: 8pt; OVERFLOW: auto } H3 { FONT-FAMILY: Tahoma; FONT-SIZE: 8pt; OVERFLOW: auto } </STYLE> </HEAD> <BODY> <% Dim s as String s = "<H3>Server-side processing</H3>" & _ "Page Generated @ " & Now() & "<BR/>" Dim SQL As String SQL = "SELECT Demographics from Sales.Store WHERE CustomerID = 3 FOR XML AUTO" Dim strConn As String strConn = "Server=(local);Database=AdventureWorks;Integrated Security=SSPI;" Dim MySqlConn As New System.Data.SqlClient.SqlConnection(strConn) Dim MySqlAdapter As New System.Data.SqlClient.SqlDataAdapter(SQL,MySqlConn) Dim MyDataSet As New System.Data.DataSet MySqlConn.Open() s = s & "<P>SqlConnection opened.</P>" MySqlAdapter.Fill(MyDataSet) s = s & "<P>" & MyDataSet.GetXml & "</P>" MySqlConn.Close() s = s & "<P>SqlConnection closed.</P>" Message.InnerHtml=s %> <SPAN id="Message" runat=server /> </BODY> </HTML>
Тестирование этого примера
Убедитесь, что службы IIS установлены, а также установлена пример базы данных AdventureWorks для SQL Server.
Данному примеру требуются службы IIS версии 5.0 или более поздней, с включенной поддержкой ASP.NET. Кроме того, необходимо установить образец базы данных AdventureWorks.
Скопируйте код приведенного выше примера и вставьте его в редактор текста или XML. Сохраните файл под именем RetrieveResults.aspx в корневой каталог, используемый для IIS. Обычно это каталог «C:\Inetpub\wwwroot».
Откройте страницу ASP.NET в окне браузера, указав следующий URL-адрес. Сначала замените MyServer на localhost или фактическое имя сервера, на котором установлены SQL Server и IIS.
https://MyServer/RetrieveResults.aspx
Результаты, сформированные в виде страниц HTML, будут выглядеть следующим образом:
Обработка на стороне сервера
Page Generated @ 3/11/2006 3:36:02 PM
SqlConnection opened.
<Sales.Store><Demographics><StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey"><AnnualSales>1500000</AnnualSales><AnnualRevenue>150000</AnnualRevenue><BankName>Primary International</BankName><BusinessType>OS</BusinessType><YearOpened>1974</YearOpened><Specialty>Road</Specialty><SquareFeet>38000</SquareFeet><Brands>3</Brands><Internet>DSL</Internet><NumberEmployees>40</NumberEmployees></StoreSurvey></Demographics></Sales.Store>
SqlConnection closed.
Примечание.
Поддержка типа данных xml в SQL Server позволяет запросить, чтобы результат запроса FOR XML возвращался как тип данных xml, а не как строковые или image-данные, с использованием директивы TYPE. Если в запросе FOR XML указана директива TYPE, она предоставляет программный доступ к результатам FOR XML, как описано в разделе Использование XML-данных в приложениях.