Delen via


XQuery-extensiefuncties - sql:column()

van toepassing op:SQL Server-

Zoals beschreven in het onderwerp, Relationele gegevens in XML-binding, kunt u de functie sql:column() gebruiken wanneer u XML-gegevenstypemethoden gebruikt om een relationele waarde in XQuery beschikbaar te maken.

De query() methode (XML-gegevenstype) wordt bijvoorbeeld gebruikt om een query op te geven op basis van een XML-exemplaar dat is opgeslagen in een variabele of kolom van xml- type. Soms wilt u ook dat uw query waarden uit een andere, niet-XML-kolom gebruikt om relationele en XML-gegevens samen te brengen. Hiervoor gebruikt u de functie sql:column().

De SQL-waarde wordt toegewezen aan een overeenkomende XQuery-waarde en het bijbehorende type is een XQuery-basistype dat gelijk is aan het bijbehorende SQL-type.

Syntaxis

  
sql:column("columnName")  

Opmerkingen

Houd er rekening mee dat verwijzing naar een kolom die is opgegeven in de sql:column() functie in een XQuery verwijst naar een kolom in de rij die wordt verwerkt.

In SQL Server kunt u alleen verwijzen naar een xml--exemplaar in de context van de bronexpressie van een XML-DML instructie invoegen; Anders kunt u niet verwijzen naar kolommen van het type xml- of een door de gebruiker gedefinieerd CLR-type.

De sql:column()-functie wordt niet ondersteund in JOIN-bewerkingen. De APPLY-bewerking kan in plaats daarvan worden gebruikt.

Voorbeelden

Een. Sql:column() gebruiken om de relationele waarde in XML op te halen

In het volgende voorbeeld ziet u in het volgende voorbeeld hoe u waarden kunt ophalen uit een niet-XML-relationele kolom om XML- en relationele gegevens te binden.

Met de query wordt XML samengesteld die het volgende formulier heeft:

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"   
  ProductModelName="Mountain 100" />  

Let op het volgende in de samengestelde XML:

  • De ProductID, ProductNameen ProductPrice kenmerkwaarden worden verkregen uit de tabel Product.

  • De ProductModelID kenmerkwaarde wordt opgehaald uit de tabel ProductModel.

  • Om de query interessanter te maken, wordt de kenmerkwaarde ProductModelName verkregen uit de kolom CatalogDescription van xml-type. Omdat de informatie over de XML-productmodelcatalogus niet wordt opgeslagen voor alle productmodellen, wordt de if-instructie gebruikt om de waarde alleen op te halen als deze bestaat.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           <Product   
               ProductID=       "{ sql:column("P.ProductID") }"  
               ProductName=     "{ sql:column("P.Name") }"  
               ProductPrice=    "{ sql:column("P.ListPrice") }"  
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
               { if (not(empty(/pd:ProductDescription))) then  
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
                else   
                   ()  
    }  
            </Product>  
    ') as Result  
    FROM Production.ProductModel PM, Production.Product P  
    WHERE PM.ProductModelID = P.ProductModelID  
    AND   CatalogDescription is not NULL  
    ORDER By PM.ProductModelID  
    

Let op het volgende uit de vorige query:

  • Omdat de waarden worden opgehaald uit twee verschillende tabellen, geeft de FROM-component twee tabellen op. De voorwaarde in de WHERE-component filtert het resultaat en haalt alleen producten op waarvan productmodellen catalogusbeschrijvingen hebben.

  • De naamruimte trefwoord in de XQuery Prolog- definieert het voorvoegsel van de XML-naamruimte, 'pd', dat wordt gebruikt in de hoofdtekst van de query. Houd er rekening mee dat de tabelaliassen, 'P' en 'PM', zijn gedefinieerd in de FROM-component van de query zelf.

  • De functie sql:column() wordt gebruikt om niet-XML-waarden in XML te brengen.

Dit is het gedeeltelijke resultaat:

ProductID               Result  
-----------------------------------------------------------------  
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38"   
                  ProductPrice="3399.99" ProductModelID="19"   
                  ProductModelName="Mountain 100" />  
...  

Met de volgende query wordt XML samengesteld die productspecifieke informatie bevat. Deze informatie omvat de ProductID, ProductName, ProductPrice en, indien beschikbaar, de ProductModelName voor alle producten die deel uitmaken van een specifiek productmodel, ProductModelID=19. De XML wordt vervolgens toegewezen aan de @x variabele van xml- type.

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <Product   
           ProductID=       "{ sql:column("P.ProductID") }"  
           ProductName=     "{ sql:column("P.Name") }"  
           ProductPrice=    "{ sql:column("P.ListPrice") }"  
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
           { if (not(empty(/pd:ProductDescription))) then  
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
            else   
               ()  
}  
        </Product>  
')   
FROM Production.ProductModel PM, Production.Product P  
WHERE PM.ProductModelID = P.ProductModelID  
And P.ProductModelID = 19  
select @x  

Zie ook

type XML vergelijken met niet-getypte XML-
XML-gegevens (SQL Server)
Exemplaren van XML-gegevens maken
xml-gegevenstypemethoden
XML DML- (XML Data Modification Language)