FOR XML-resultaten gebruiken in toepassingscode
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Met BEHULP van FOR XML-componenten met SQL-query's kunt u queryresultaten ophalen en zelfs casten als XML-gegevens. Met deze functionaliteit kunt u het volgende doen wanneer VOOR XML-queryresultaten kunnen worden gebruikt in XML-toepassingscode:
Sql-tabellen opvragen voor exemplaren van XML Data (SQL Server) waarden
Pas de TYPE-instructie toe in FOR XML-query's om het resultaat te retourneren van query's die tekst- of afbeeldingstypegegevens bevatten als XML
Dit artikel bevat voorbeelden die deze benaderingen demonstreren.
FOR XML-gegevens ophalen met ADO- en XML-gegevenseilanden
Het ADO-Stream-object of andere objecten die ondersteuning bieden voor de COM IStream-interface, zoals de Active Server Pages (ASP)-Request- en Response-objecten, kunnen worden gebruikt om de resultaten op te slaan wanneer u met FOR XML-query's werkt.
De volgende ASP-code toont bijvoorbeeld de resultaten van het uitvoeren van een query op een xml- gegevenstypekolom, Demografische gegevens, in de Sales.Store
tabel van de AdventureWorks-voorbeelddatabase. De query zoekt met name naar de instantiewaarde van deze kolom voor de rij waarin de CustomerID gelijk is aan 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 -->
Deze asp-voorbeeldpagina bevat VBScript aan de serverzijde die gebruikmaakt van ADO om de FOR XML-query uit te voeren en de XML-resultaten te retourneren in een XML-gegevenseiland, MyDataIsle. Dit XML-gegevenseiland wordt vervolgens geretourneerd in de browser voor aanvullende verwerking aan de clientzijde. Aanvullende VBScript-code aan de clientzijde wordt vervolgens gebruikt om de inhoud van het XML-gegevenseiland te verwerken. Dit proces wordt uitgevoerd voordat de inhoud wordt weergegeven als onderdeel van de resulterende DHTML en het openen van een berichtvak om de vooraf verwerkte inhoud van het XML-gegevenseiland weer te geven.
Dit voorbeeld testen
Controleer of IIS is geïnstalleerd en of de AdventureWorks-voorbeelddatabase voor SQL Server is geïnstalleerd.
Voor dit voorbeeld is vereist dat IIS-versie (Internet Information Services) versie 5.0 of nieuwere versies zijn geïnstalleerd met ASP-ondersteuning ingeschakeld. De AdventureWorks-voorbeelddatabase moet ook worden geïnstalleerd.
Kopieer het codevoorbeeld dat eerder is opgegeven en plak het in de XML- of teksteditor die u gebruikt. Sla het bestand op als RetrieveResults.asp in de hoofdmap die wordt gebruikt voor IIS. Dit is meestal C:Inetpub\wwwroot.
Open de ASP-pagina in een browservenster met behulp van de volgende URL. Vervang eerst 'MyServer' door 'localhost' of de werkelijke naam van de server waarop SQL Server en IIS zijn geïnstalleerd.
https://MyServer/RetrieveResults.asp
De gegenereerde HTML-paginaresultaten die worden weergegeven, zijn vergelijkbaar met de volgende voorbeelduitvoer:
Verwerking aan serverzijde
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
Verwerking aan de clientzijde van XML-document MyDataIsle
JaarlijkseVerkoop: 1500000
JaarlijkseOmzet: 150000
Banknaam: Primary International
BusinessType: besturingssysteem
JaarGeopend: 1974
Specialiteit: Weg
SquareFeet: 38000
Merken: 3
Internet: DSL
AantalWerknemers: 40
In het berichtvak VBScript wordt vervolgens de volgende oorspronkelijke, niet-gefilterde XML-gegevenseilandinhoud weergegeven die is geretourneerd door de RESULTATEN van de FOR XML-query.
<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-gegevens ophalen met ASP.NET en .NET Framework
Net als in het vorige voorbeeld toont de volgende ASP.NET code de resultaten van het uitvoeren van een query op een xml-kolom gegevenstype, Demografische gegevens, in de Sales.Store tabel van de AdventureWorks-voorbeelddatabase. Net als in het vorige voorbeeld zoekt de query naar de instantiewaarde van deze kolom voor de rij waar de CustomerID gelijk is aan 3.
In dit voorbeeld worden de volgende door Microsoft .NET Framework beheerde API's gebruikt om de resultaten van de FOR XML-query's te retourneren en weer te geven:
SqlConnection- wordt gebruikt om een verbinding met SQL Server te openen, op basis van de inhoud van een opgegeven verbindingsreeksvariabele, strConn.
SqlDataAdapter wordt vervolgens gebruikt als de gegevensadapter en maakt gebruik van de SQL-verbinding en een opgegeven SQL-queryreeks om de FOR XML-query uit te voeren.
Nadat de query is uitgevoerd, wordt de methode SqlDataAdapter.Fill vervolgens aangeroepen en doorgegeven aan een exemplaar van een DataSet, MyDataSet, om de gegevensset te vullen met de uitvoer van de FOR XML-query.
De methode DataSet.GetXml wordt vervolgens aangeroepen om de queryresultaten te retourneren als een tekenreeks die kan worden weergegeven op de door de server gegenereerde HTML-pagina.
<%@ 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>
Dit voorbeeld testen
Controleer of IIS is geïnstalleerd en of de AdventureWorks-voorbeelddatabase voor SQL Server is geïnstalleerd.
Voor dit voorbeeld is vereist dat IIS-versie (Internet Information Services) versie 5.0 of nieuwere versies zijn geïnstalleerd met ASP.NET ondersteuning is ingeschakeld. De AdventureWorks-voorbeelddatabase moet ook worden geïnstalleerd.
Kopieer de code die eerder is opgegeven en plak deze in de XML- of teksteditor die u gebruikt. Sla het bestand op als RetrieveResults.aspx in de hoofdmap die wordt gebruikt voor IIS. Dit is meestal C:Inetpub\wwwroot.
Open de pagina ASP.NET in een browservenster met behulp van de volgende URL. Vervang eerst 'MyServer' door 'localhost' of de werkelijke naam van de server waarop SQL Server en IIS zijn geïnstalleerd.
https://MyServer/RetrieveResults.aspx
De gegenereerde HTML-paginaresultaten die worden weergegeven, zijn vergelijkbaar met de volgende voorbeelduitvoer:
Verwerking aan serverzijde
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.
Notitie
Met de ondersteuning voor het gegevenstype SQL Server XML kunt u aanvragen dat het resultaat van een FOR XML-query wordt geretourneerd als xml- gegevenstype, in plaats van als tekenreeks- of afbeeldingstypegegevens, door de TYPE-instructieop te geven. Wanneer de TYPE-instructie wordt gebruikt in FOR XML-query's, biedt deze programmatische toegang tot de FOR XML-resultaten die vergelijkbaar zijn met die in XML-gegevens gebruiken in toepassingen.