Usar los resultados de FOR XML en el código de aplicación
Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
Al utilizar cláusulas FOR XML con consultas SQL, se pueden recuperar e incluso convertir los resultados de la consulta como datos XML. Esta funcionalidad permite realizar las siguientes operaciones cuando los resultados de las consultas FOR XML se pueden utilizar en el código de aplicación XML:
Consultar tablas SQL de consulta para instancias de valores de Datos XML (SQL Server)
Aplicar la TYPE Directive in FOR XML Queries para devolver como XML el resultado de las consultas que contienen datos con tipo de texto o imagen
Este artículo proporciona ejemplos que muestran estos planteamientos.
Recuperar datos FOR XML con islas de datos ADO y XML
El objeto ADO Stream u otros objetos que admiten la interfaz COM IStream , como los objetos Request y Response de las páginas Active Server (ASP), se pueden usar para guardar los resultados cuando se trabaja con consultas FOR XML.
Por ejemplo, el siguiente código ASP muestra los resultados que se obtienen al consultar una columna de tipo de datos xml, Demographics, en la tabla Sales.Store
de la base de datos de ejemplo AdventureWorks. Concretamente, la consulta busca el valor de instancia de esta columna para la fila en la que CustomerID es igual a 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 -->
Esta página ASP de ejemplo contiene código VBScript de servidor que utiliza ADO para ejecutar la consulta FOR XML y devolver los resultados XML en una isla de datos XML, MyDataIsle. Después, la isla de datos XML se devuelve en el explorador para su posterior procesamiento del lado cliente. Después, para procesar el contenido de la isla de datos XML se utiliza código VBScript del lado cliente adicional. Este proceso se lleva a cabo antes de mostrar el contenido como parte del DHTML resultante y abrir un cuadro de mensaje con el contenido de la isla de datos XML previamente procesado.
Probar este ejemplo
Compruebe que se ha instalado IIS y la base de datos de ejemplo AdventureWorks para SQL Server.
Este ejemplo requiere la instalación de Internet Information Services (IIS) 5.0 ó una versión posterior, con la compatibilidad con ASP habilitada. Asimismo, debe instalarse la base de datos de ejemplo AdventureWorks.
Copie el ejemplo de código previamente proporcionado y péguelo en su editor XML o editor de texto habitual. Guarde el archivo como RetrieveResults.asp en el directorio raíz que se utiliza para IIS. Normalmente es C:Inetpub\wwwroot.
Abra la página ASP en una ventana del explorador utilizando la dirección URL siguiente. Primero, sustituya "MyServer" por "localhost" o el verdadero nombre del servidor donde se han instalado SQL Server e IIS.
https://MyServer/RetrieveResults.asp
Los resultados de la página HTML generada que aparecen serán similares a la siguiente salida de ejemplo:
Procesamiento en el servidor
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
Procesamiento del documento XML MyDataIsle en el cliente
AnnualSales: 1500000
AnnualRevenue: 150000
BankName: Primary International
BusinessType: OS
YearOpened: 1974
Specialty: Road
SquareFeet: 38000
Brands: 3
Internet: DSL
NumberEmployees: 40
A continuación, el cuadro de mensaje VBScript mostrará el siguiente contenido de la isla de datos XML original, sin filtrar, que ha sido devuelto en los resultados de la consulta 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>
Recuperar datos FOR XML con ASP.NET y .NET Framework
Como en el ejemplo anterior, el siguiente código ASP.NET muestra los resultados que se obtienen al consultar una columna de tipo de datos xml , Demographics, en la tabla Sales.Store de la base de datos de ejemplo AdventureWorks. Como en el ejemplo anterior, la consulta busca el valor de instancia de esta columna para la fila en la que CustomerID es igual a 3.
En este ejemplo, se utilizan las siguientes API administradas de Microsoft .NET Framework para devolver y representar los resultados de la consulta FOR XML:
Se utilizaSqlConnection para abrir una conexión con SQL Server basada en el contenido de una variable de cadena de conexión especificada, strConn.
A continuación, se utilizaSqlDataAdapter como adaptador de datos y se emplea la conexión SQL y una cadena de consulta SQL especificada para ejecutar la consulta FOR XML.
Después de que se ha ejecutado la consulta, se llama al método SqlDataAdapter.Fill , al que se le pasa una instancia de DataSet, MyDataSet, para llenar el conjunto de datos con la salida de la consulta FOR XML.
Después, se llama al método DataSet.GetXml para devolver los resultados de la consulta como una cadena que se puede mostrar en la página HTML generada por el servidor.
<%@ 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>
Probar este ejemplo
Compruebe que se ha instalado IIS y la base de datos de ejemplo AdventureWorks para SQL Server.
Este ejemplo requiere la instalación de Internet Information Services (IIS) 5.0 ó una versión posterior, con la compatibilidad con ASP.NET habilitada. Asimismo, debe instalarse la base de datos de ejemplo AdventureWorks.
Copie el código previamente proporcionado y péguelo en su editor XML o editor de texto habitual. Guarde el archivo como RetrieveResults.aspx en el directorio raíz utilizado para IIS. Normalmente es C:Inetpub\wwwroot.
Abra la página ASP.NET en una ventana del explorador utilizando la dirección URL siguiente. Primero, sustituya "MyServer" por "localhost" o el verdadero nombre del servidor donde se han instalado SQL Server e IIS.
https://MyServer/RetrieveResults.aspx
Los resultados de la página HTML generada que aparecen serán similares a la siguiente salida de ejemplo:
Procesamiento en el servidor
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.
Nota:
La compatibilidad con el tipo de datos xml de SQL Server permite solicitar que el resultado de una consulta FOR XML se devuelva como un tipo de datos xml en lugar de datos con tipo cadena o imagen, especificando la directiva TYPE. Cuando se usa la directiva TYPE en las consultas FOR XML, el tipo de acceso que se proporciona mediante programación a los resultados de FOR XML es similar al que se muestra en Usar datos XML en las aplicaciones.
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de