Delen via


SELECT - FOR-component (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft FabricSQL-database in Microsoft Fabric

Gebruik de FOR-component om een van de volgende opties voor queryresultaten op te geven.

  • Updates toestaan tijdens het weergeven van queryresultaten in een cursor in de bladermodus door FOR BROWSEop te geven.

  • Maak queryresultaten op als XML door FOR XMLop te geven.

  • Maak queryresultaten op als JSON door FOR JSONop te geven.

Transact-SQL syntaxisconventies

Syntaxis

[ FOR { BROWSE | <XML> | <JSON>} ]  

<XML> ::=  
XML   
{   
    { RAW [ ( 'ElementName' ) ] | AUTO }   
    [   
        <CommonDirectivesForXML>   
        [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]   
        [ , ELEMENTS [ XSINIL | ABSENT ]   
    ]  
  | EXPLICIT   
    [   
        <CommonDirectivesForXML>   
        [ , XMLDATA ]   
    ]  
  | PATH [ ( 'ElementName' ) ]   
    [  
        <CommonDirectivesForXML>   
        [ , ELEMENTS [ XSINIL | ABSENT ] ]  
    ]  
}   

<CommonDirectivesForXML> ::=   
[ , BINARY BASE64 ]  
[ , TYPE ]  
[ , ROOT [ ( 'RootName' ) ] ]  

<JSON> ::=  
JSON   
{   
    { AUTO | PATH }   
    [   
        [ , ROOT [ ( 'RootName' ) ] ]  
        [ , INCLUDE_NULL_VALUES ]  
        [ , WITHOUT_ARRAY_WRAPPER ]  
    ]  

}

BLADEREN

BLADEREN

Hiermee geeft u op dat updates worden toegestaan tijdens het weergeven van de gegevens in een DB-Library cursor in de bladermodus. Een tabel kan in een toepassing worden bekeken als de tabel een tijdstempel bevat kolom, de tabel een unieke index heeft en de optie FOR BROWSE zich aan het einde van de SELECT-instructies bevindt die naar een exemplaar van SQL Server worden verzonden.

Notitie

U kunt de <lock_hint> HOLDLOCK niet gebruiken in een SELECT-instructie die de optie FOR BROWSE bevat.

FOR BROWSE kan niet worden weergegeven in SELECT-instructies die zijn toegevoegd door de operator UNION.

Notitie

Wanneer de unieke indexsleutelkolommen van een tabel null kunnen zijn en de tabel zich aan de binnenkant van een outer join bevindt, wordt de index niet ondersteund door de bladermodus.

Met de bladermodus kunt u de rijen in uw SQL Server-tabel scannen en de gegevens in de tabel één rij tegelijk bijwerken. Als u toegang wilt krijgen tot een SQL Server-tabel in uw toepassing in de bladermodus, moet u een van de volgende twee opties gebruiken:

  • De SELECT-instructie die u gebruikt om toegang te krijgen tot de gegevens uit uw SQL Server-tabel, moet eindigen met de trefwoorden VOOR BLADEREN. Wanneer u de optie VOOR BLADEREN inschakelt om de bladermodus te gebruiken, worden tijdelijke tabellen gemaakt.

  • U moet de volgende Transact-SQL instructie uitvoeren om de bladermodus in te schakelen met behulp van de optie NO_BROWSETABLE:

    SET NO_BROWSETABLE ON  
    

    Wanneer u de optie NO_BROWSETABLE inschakelt, gedragen alle SELECT-instructies zich alsof de optie VOOR BLADEREN wordt toegevoegd aan de instructies. Met de optie NO_BROWSETABLE worden echter niet de tijdelijke tabellen gemaakt die de optie VOOR BLADEREN doorgaans gebruikt om de resultaten naar uw toepassing te verzenden.

Wanneer u toegang probeert te krijgen tot de gegevens uit SQL Server-tabellen in de bladermodus met behulp van een SELECT-query met een outer join-instructie en wanneer een unieke index is gedefinieerd in de tabel die zich aan de binnenzijde van een outer join-instructie bevindt, biedt de bladermodus geen ondersteuning voor de unieke index. De bladermodus ondersteunt alleen de unieke index wanneer alle kolommen met een unieke indexsleutel NULL waarden kunnen accepteren. De bladermodus biedt geen ondersteuning voor de unieke index als aan de volgende voorwaarden wordt voldaan:

  • U probeert toegang te krijgen tot de gegevens uit SQL Server-tabellen in de bladermodus met behulp van een SELECT-query met een outer join-instructie.

  • Er wordt een unieke index gedefinieerd in de tabel die zich aan de binnenkant van een outer join-instructie bevindt.

Volg deze stappen om dit gedrag in de bladermodus te reproduceren:

  1. Maak in SQL Server Management Studio een database met de naam SampleDB.

  2. Maak in de SampleDB-database een tleft tabel en een tright tabel die beide één kolom met de naam c1bevatten. Definieer een unieke index voor de kolom c1 in de tleft tabel en stel de kolom in om NULL waarden te accepteren. Voer hiervoor de volgende Transact-SQL instructies uit in een geschikt queryvenster:

    CREATE TABLE tleft(c1 INT NULL UNIQUE) ;  
    GO   
    CREATE TABLE tright(c1 INT NULL) ;  
    GO  
    
  3. Voeg verschillende waarden in de tleft tabel en de tright tabel in. Zorg ervoor dat u een NULL-waarde in de tleft tabel invoegt. Voer hiervoor de volgende Transact-SQL instructies uit in het queryvenster:

    INSERT INTO tleft VALUES(2) ;  
    INSERT INTO tleft VALUES(NULL) ;  
    INSERT INTO tright VALUES(1) ;  
    INSERT INTO tright VALUES(3) ;  
    INSERT INTO tright VALUES(NULL) ;  
    GO  
    
  4. Schakel de optie NO_BROWSETABLE in. Voer hiervoor de volgende Transact-SQL instructies uit in het queryvenster:

    SET NO_BROWSETABLE ON ;  
    GO  
    
  5. Open de gegevens in de tleft tabel en de tright tabel met behulp van een outer join-instructie in de SELECT-query. Zorg ervoor dat de tleft tabel zich aan de binnenkant van de outer join-instructie bevindt. Voer hiervoor de volgende Transact-SQL instructies uit in het queryvenster:

    SELECT tleft.c1   
    FROM tleft   
    RIGHT JOIN tright   
    ON tleft.c1 = tright.c1   
    WHERE tright.c1 <> 2 ;
    

    Let op de volgende uitvoer in het deelvenster Resultaten:

    c1  
    ---
    NULL  
    NULL  
    

Nadat u de SELECT-query hebt uitgevoerd om toegang te krijgen tot de tabellen in de bladermodus, bevat de resultatenset van de SELECT query twee NULL waarden voor de kolom c1 in de tleft tabel vanwege de definitie van de right outer join-instructie. Daarom kunt u in de resultatenset geen onderscheid maken tussen de NULL waarden die afkomstig zijn uit de tabel en de NULL waarden die door de right outer join-instructie zijn geïntroduceerd. Mogelijk ontvangt u onjuiste resultaten als u de NULL waarden uit de resultatenset moet negeren.

Notitie

Als de kolommen die zijn opgenomen in de unieke index geen NULL waarden accepteren, worden alle NULL waarden in de resultatenset geïntroduceerd door de right outer join-instructie.

FOR XML

XML

Hiermee geeft u op dat de resultaten van een query moeten worden geretourneerd als een XML-document. Een van de volgende XML-modi moet worden opgegeven: RAW, AUTO, EXPLICIT. Zie FOR XML (SQL Server)voor meer informatie over XML-gegevens en SQL Server.

RAW [ ('ElementName') ]

Neemt het queryresultaat en transformeert elke rij in de resultatenset in een XML-element met een algemene id <row /> als elementtag. U kunt desgewenst een naam opgeven voor het rijelement. De resulterende XML-uitvoer gebruikt de opgegeven ElementName als het rijelement dat voor elke rij wordt gegenereerd. Zie RAW-modus gebruiken met FOR XML-voor meer informatie.

AUTO

Retourneert queryresultaten in een eenvoudige, geneste XML-structuur. Elke tabel in de FROM-component, waarvoor ten minste één kolom wordt vermeld in de SELECT component, wordt weergegeven als een XML-element. De kolommen in de component SELECT worden toegewezen aan de juiste elementkenmerken. Zie Auto-modus gebruiken met FOR XML-voor meer informatie.

UITDRUKKELIJK

Hiermee geeft u op dat de vorm van de resulterende XML-structuur expliciet wordt gedefinieerd. Met deze modus moeten query's op een bepaalde manier worden geschreven, zodat aanvullende informatie over het gewenste nesten expliciet wordt opgegeven. Zie EXPLICIETe modus gebruiken met FOR XML-voor meer informatie.

XMLDATA

Retourneert een inline XDR-schema, maar voegt het hoofdelement niet toe aan het resultaat. Als XMLDATA is opgegeven, wordt het XDR-schema toegevoegd aan het document.

Belangrijk

De XMLDATA richtlijn is afgeschaft. Gebruik XSD-generatie in het geval van RAW- en AUTO-modi. Er is geen vervanging voor de XMLDATA richtlijn in EXPLICIT modus. Deze functie wordt verwijderd in een toekomstige versie van SQL Server. Vermijd het gebruik van deze functie in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel gebruikmaken van deze functie.

Ongewenste regeleinden onderdrukken: U kunt SQL Server Management Studio (SSMS) gebruiken om een query uit te voeren die gebruikmaakt van de FOR XML-component. Soms wordt een grote hoeveelheid XML geretourneerd en weergegeven in één rastercel. De XML-tekenreeks kan langer zijn dan één SSMS-rastercel kan één regel bevatten. In dergelijke gevallen kan SSMS regeleindetekens invoegen tussen lange segmenten van de hele XML-tekenreeks. Dergelijke regeleinden kunnen zich voordoen in het midden van een subtekenreeks die niet over lijnen mag worden gesplitst. U kunt de regeleinden voorkomen met behulp van een cast-AS XMLDATA. Deze oplossing kan ook van toepassing zijn wanneer u FOR JSON PATHgebruikt, zoals in de volgende Transact-SQL voorbeeldinstructie SELECT:

SELECT CAST(
    (SELECT column1, column2
        FROM my_table
        FOR XML PATH('')
    )
        AS VARCHAR(MAX)
) AS XMLDATA ;

XMLSCHEMA [ ('TargetNameSpaceURI') ]

Retourneert een inline XSD-schema. U kunt desgewenst een doelnaamruimte-URI opgeven wanneer u deze instructie opgeeft, die de opgegeven naamruimte in het schema retourneert. Zie Een inline XSD-schema genererenvoor meer informatie.

ELEMENTEN

Hiermee geeft u op dat de kolommen worden geretourneerd als subelementen. Anders worden ze toegewezen aan XML-kenmerken. Deze optie wordt alleen ondersteund in de modi RAW, AUTO en PATH. Zie RAW-modus gebruiken met FOR XML-voor meer informatie.

XSINIL

Hiermee geeft u op dat een element met xsi:nil kenmerk is ingesteld op True worden gemaakt voor NULL kolomwaarden. Deze optie kan alleen worden opgegeven met ELEMENTS instructie. Zie voor meer informatie:

AFWEZIG

Geeft aan dat voor NULL kolomwaarden overeenkomende XML-elementen niet worden toegevoegd aan het XML-resultaat. Geef deze optie alleen op met ELEMENTS.

PATH [ ('ElementName') ]

Hiermee wordt een <row> element wrapper gegenereerd voor elke rij in de resultatenset. U kunt desgewenst een elementnaam opgeven voor de <row> element-wrapper. Als er een lege tekenreeks wordt opgegeven, zoals FOR XML PATH ('') ), wordt er geen wrapper-element gegenereerd. Het gebruik van PATH biedt mogelijk een eenvoudiger alternatief voor query's die zijn geschreven met behulp van de EXPLICIT-instructie. Zie PATH-modus gebruiken met FOR XML-voor meer informatie.

BINAIR BASE64

Hiermee geeft u op dat de query de binaire gegevens retourneert in binaire base64-gecodeerde indeling. Wanneer u binaire gegevens ophaalt met behulp van RAW- en EXPLICIT modus, moet deze optie worden opgegeven. Dit is de standaardinstelling in AUTO modus.

TYPE

Hiermee geeft u op dat de query resultaten retourneert als xml- type. Zie TYPE-instructie in FOR XML-query'svoor meer informatie.

ROOT [ ('RootName') ]

Hiermee geeft u op dat één element op het hoogste niveau moet worden toegevoegd aan de resulterende XML. U kunt desgewenst de naam van het hoofdelement opgeven dat moet worden gegenereerd. Als de optionele hoofdnaam niet is opgegeven, wordt het standaardelement <root> toegevoegd.

Zie FOR XML (SQL Server)voor meer informatie.

Voorbeeld

In het volgende voorbeeld wordt FOR XML AUTO opgegeven met de opties TYPE en XMLSCHEMA. Vanwege de optie TYPE wordt de resultatenset als een xml--type aan de client geretourneerd. De XMLSCHEMA optie geeft aan dat het inline XSD-schema is opgenomen in de XML-gegevens die worden geretourneerd, en de optie ELEMENTS geeft aan dat het XML-resultaat elementgericht is.

USE AdventureWorks2022;  
GO  
SELECT p.BusinessEntityID, FirstName, LastName, PhoneNumber AS Phone  
FROM Person.Person AS p  
JOIN Person.PersonPhone AS pph ON p.BusinessEntityID  = pph.BusinessEntityID  
WHERE LastName LIKE 'G%'  
ORDER BY LastName, FirstName   
FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;  

VOOR JSON

Opmerkingen

In Fabric Data Warehouse moet FOR JSON de laatste operator in de query zijn en is dit dus niet toegestaan binnen subquery's.

JSON

Geef FOR JSON op om de resultaten te retourneren van een query die is opgemaakt als JSON-tekst. U moet ook een van de volgende JSON-modi opgeven: AUTO of PATH. Zie Queryresultaten opmaken als JSON met FOR JSON (SQL Server)voor meer informatie over de component FOR JSON.

AUTO

Maak de JSON-uitvoer automatisch op op basis van de structuur van de SELECT-instructie door FOR JSON AUTOop te geven. Zie JSON-uitvoer automatisch opmaken met DE AUTO-modus (SQL Server)voor meer informatie en voorbeelden.

PAD

Krijg volledige controle over de indeling van de JSON-uitvoer door FOR JSON PATHop te geven. PATH modus kunt u wrapperobjecten maken en complexe eigenschappen nesten. Zie Geneste JSON-uitvoer opmaken met PATH-modus (SQL Server)voor meer informatie en voorbeelden.

INCLUDE_NULL_VALUES

Neem NULL waarden op in de JSON-uitvoer door de optie INCLUDE_NULL_VALUES op te geven met de FOR JSON component. Als u deze optie niet opgeeft, bevat de uitvoer geen JSON-eigenschappen voor NULL waarden in de queryresultaten. Zie Null-waarden opnemen in JSON-uitvoer met de INCLUDE_NULL_VALUES Option (SQL Server)voor meer informatie en voorbeelden.

ROOT [ ('RootName') ]

Voeg één element op het hoogste niveau toe aan de JSON-uitvoer door de optie ROOT op te geven met de FOR JSON component. Als u de optie ROOT niet opgeeft, heeft de JSON-uitvoer geen hoofdelement. Zie Een hoofdknooppunt toevoegen aan JSON-uitvoer met derootoptie (SQL Server) voor meer informatie en voorbeelden.

WITHOUT_ARRAY_WRAPPER

Verwijder de vierkante haken die de JSON-uitvoer standaard omsluiten door de optie WITHOUT_ARRAY_WRAPPER op te geven met de FOR JSON-component. Als u deze optie niet opgeeft, wordt de JSON-uitvoer tussen vierkante haken geplaatst. Gebruik de optie WITHOUT_ARRAY_WRAPPER om één JSON-object als uitvoer te genereren. Zie Vierkante haken verwijderen uit JSON-uitvoer met de WITHOUT_ARRAY_WRAPPER Option (SQL Server)voor meer informatie.

Zie Queryresultaten opmaken als JSON met FOR JSON (SQL Server)voor meer informatie.