Freigeben über


SELECT – FOR Clause (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft FabricSQL-Datenbank in Microsoft Fabric SQL in Microsoft Fabric

Mit der FOR-Klausel können Sie eine der folgenden Optionen für Abfrageergebnisse angeben.

  • Aktualisierungen beim Anzeigen von Abfrageergebnissen in einem Suchmoduscursor zulassen, indem Sie FOR BROWSEangeben.

  • Formatieren Sie Abfrageergebnisse als XML, indem Sie FOR XMLangeben.

  • Formatieren Sie Abfrageergebnisse als JSON, indem Sie FOR JSONangeben.

Transact-SQL-Syntaxkonventionen

Syntax

[ 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 ]  
    ]  

}

FOR BROWSE

BROWSE

Gibt an, dass Updates zulässig sind, während Daten in einem DB-Library-Cursor im Durchsuchenmodus angezeigt werden. Eine Tabelle kann in einer Anwendung durchsucht werden, wenn sie eine timestamp-Spalte enthält, über einen eindeutigen Index verfügt und sich die FOR BROWSE-Option am Ende der an eine SQL Server-Instanz gesendeten SELECT-Anweisungen befindet.

Hinweis

<lock_hint> HOLDLOCK kann nicht in einer SELECT-Anweisung mit der FOR BROWSE-Option verwendet werden.

FOR BROWSE kann nicht in SELECT-Anweisungen verwendet werden, die durch den UNION-Operator miteinander verknüpft sind.

Hinweis

Wenn die eindeutigen Indexschlüsselspalten einer Tabelle NULL-Werte zulassen und sich die Tabelle auf der Innenseite eines äußeren Joins befindet, wird der Durchsuchenmodus vom Index nicht unterstützt.

Mit dem Durchsuchenmodus können Sie die Zeilen in der SQL Server-Tabelle scannen und die Daten in der Tabelle zeilenweise aktualisieren. Sie sollten für den Zugriff im Durchsuchenmodus auf eine SQL Server-Tabelle in der Anwendung eine der beiden folgenden Optionen verwenden:

  • Die von Ihnen für den Zugriff auf die Daten Ihrer SQL Server-Tabelle verwendete SELECT-Anweisung muss mit den Schlüsselwörtern FOR BROWSE enden. Wenn Sie die Option FOR BROWSE für die Verwendung des Durchsuchenmodus aktivieren, werden temporäre Tabellen erstellt.

  • Sie müssen die folgende Transact-SQL-Anweisung ausführen, um den Durchsuchenmodus mit der Option NO_BROWSETABLE zu aktivieren:

    SET NO_BROWSETABLE ON  
    

    Wenn Sie die Option NO_BROWSETABLE aktivieren, verhalten sich alle SELECT-Anweisungen so, als würde die Option FOR BROWSE an die Anweisungen angefügt. Die Option NO_BROWSETABLE erstellt jedoch nicht die temporären Tabellen, welche die Option FOR BROWSE im Allgemeinen verwendet, um die Ergebnisse an Ihre Anwendung zu senden.

Wenn Sie versuchen, im Durchsuchenmodus auf die Daten aus den SQL Server-Tabellen mit einer SELECT-Abfrage zuzugreifen, die eine äußere Verknüpfungsanweisung enthält, und wenn ein eindeutiger Index für die Tabelle definiert ist, die sich innerhalb der äußeren Verknüpfungsanweisung befindet, unterstützt der Durchsuchenmodus den eindeutigen Index nicht. Der Suchmodus unterstützt den eindeutigen Index nur, wenn alle eindeutigen Indexschlüsselspalten NULL Werte akzeptieren können. Der eindeutige Index wird durch den Durchsuchenmodus nicht unterstützt, wenn die folgenden Bedingungen zutreffen:

  • Sie versuchen, im Durchsuchenmodus auf die Daten aus SQL Server-Tabellen mit einer SELECT-Anweisung zuzugreifen, die eine äußere Verknüpfungsanweisung enthält.

  • Es ist ein eindeutiger Index für die Tabelle definiert, die sich innerhalb eines äußeren Joins befindet.

Um dieses Verhalten im Durchsuchenmodus zu reproduzieren, führen Sie folgende Schritte aus:

  1. Erstellen Sie in SQL Server Management Studio eine Datenbank mit dem Namen SampleDB.

  2. Erstellen Sie in der SampleDB-Datenbank eine tleft Tabelle und eine tright Tabelle, die beide eine einzelne Spalte enthalten, die c1benannt ist. Definieren Sie einen eindeutigen Index für die c1 Spalte in der tleft Tabelle, und legen Sie die Spalte so fest, dass NULL Werte akzeptiert werden. Führen Sie hierzu die folgenden Transact-SQL-Anweisungen in einem entsprechenden Abfragefenster aus:

    CREATE TABLE tleft(c1 INT NULL UNIQUE) ;  
    GO   
    CREATE TABLE tright(c1 INT NULL) ;  
    GO  
    
  3. Fügen Sie mehrere Werte in die tleft Tabelle und die tright Tabelle ein. Stellen Sie sicher, dass Sie einen NULL Wert in die tleft Tabelle einfügen. Führen Sie hierzu die folgenden Transact-SQL-Anweisungen in dem Abfragefenster aus:

    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. Aktivieren Sie die Option NO_BROWSETABLE. Führen Sie hierzu die folgenden Transact-SQL-Anweisungen in dem Abfragefenster aus:

    SET NO_BROWSETABLE ON ;  
    GO  
    
  5. Greifen Sie auf die Daten in der tleft Tabelle und der tright Tabelle zu, indem Sie eine äußere Join-Anweisung in der SELECT Abfrage verwenden. Stellen Sie sicher, dass sich die tleft Tabelle auf der inneren Seite der äußeren Verknüpfungsanweisung befindet. Führen Sie hierzu die folgenden Transact-SQL-Anweisungen in dem Abfragefenster aus:

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

    Beachten Sie die folgende Ausgabe im Bereich Ergebnisse:

    c1  
    ---
    NULL  
    NULL  
    

Nachdem Sie die SELECT Abfrage ausgeführt haben, um im Suchmodus auf die Tabellen zuzugreifen, enthält das Resultset der abfrage SELECT zwei NULL Werte für die Spalte c1 in der tleft Tabelle aufgrund der Definition der rechten äußeren Verknüpfungsanweisung. Daher können Sie im Resultset nicht zwischen den NULL Werten unterscheiden, die aus der Tabelle stammen, und den NULL Werten, die die rechte äußere Join-Anweisung eingeführt hat. Möglicherweise erhalten Sie falsche Ergebnisse, wenn Sie die NULL Werte aus dem Resultset ignorieren müssen.

Hinweis

Wenn die Spalten, die im eindeutigen Index enthalten sind, nicht NULL Werte akzeptieren, wurden alle NULL Werte im Resultset von der rechten äußeren Verknüpfungsanweisung eingeführt.

FOR XML

XML

Gibt an, dass die Ergebnisse einer Abfrage als XML-Dokument zurückgegeben werden. Einer der folgenden XML-Modi muss angegeben werden: RAW, AUTO, EXPLICIT. Weitere Informationen zu XML-Daten und SQL Server finden Sie unter FOR XML (SQL Server).

RAW [ ('ElementName') ]

Verwendet das Abfrageergebnis und wandelt jede Zeile im Resultset in ein XML-Element mit einem generischen Bezeichner <row /> als Elementtag um. Sie können optional einen Namen für das Zeilenelement angeben. Die resultierende XML-Ausgabe verwendet die angegebene ElementName als für jede Zeile generiertes Zeilenelement. Weitere Informationen finden Sie unter Verwenden des RAW-Modus mit FOR XML.

AUTO

Gibt Abfrageergebnisse in einer einfachen, geschachtelten XML-Struktur zurück. Jede Tabelle in der FROM-Klausel, für die mindestens eine Spalte in der SELECT-Klausel aufgeführt ist, wird als XML-Element dargestellt. Die in der SELECT-Klausel aufgeführten Spalten werden den entsprechenden Elementattributen zugeordnet. Weitere Informationen finden Sie unter Verwenden des AUTO-Modus mit FOR XML.

EXPLICIT

Gibt an, dass die Form der sich ergebenden XML-Struktur explizit definiert wird. In diesem Modus müssen die Abfragen auf eine bestimmte Weise geschrieben werden, sodass zusätzliche Informationen zur gewünschten Schachtelung explizit angegeben werden. Weitere Informationen finden Sie unter Verwenden des EXPLICIT-Modus mit FOR XML.

XMLDATA

Gibt das XDR-Inlineschema zurück, fügt jedoch das Stammelement dem Ergebnis nicht hinzu. Wenn XMLDATA angegeben ist, wird das XDR-Schema an das Dokument angefügt.

Wichtig

Die richtlinie XMLDATA ist veraltet. Verwenden Sie XSD-Generierung für RAW- und AUTO-Modus. Es gibt keinen Ersatz für die XMLDATA-Direktive im EXPLICIT Modus. Diese Funktion wird in einer zukünftigen Version von SQL Serverentfernt. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden.

Unterdrücken unerwünschter Zeilenumbrüche: Sie können SQL Server Management Studio (SSMS) verwenden, um eine Abfrage auszustellen, die die FOR XML-Klausel verwendet. Dabei wird manchmal eine große Menge an XML-Zeichenfolgen zurückgegeben und in einer Rasterzelle angezeigt. Die XML-Zeichenfolgen umfassen unter Umständen mehr Zeichen als eine SSMS-Rasterzelle pro Zeile verarbeiten kann. In diesen Fällen fügt SSMS möglicherweise Zeichen für Zeilenumbrüche in lange Segmente der gesamten XML-Zeichenfolge ein. Diese Zeilenumbrüche werden ggf. in Teilzeichenfolgen eingefügt, die nicht auf mehrere Zeilen aufgeteilt werden sollten. Sie können die Zeilenumbrüche mithilfe einer Umwandlung AS XMLDATAverhindern. Diese Lösung kann auch angewendet werden, wenn Sie FOR JSON PATHverwenden, wie in der folgenden Transact-SQL Beispiel-SELECT-Anweisung gezeigt:

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

XMLSCHEMA [ ('TargetNameSpaceURI') ]

Gibt das XSD-Inlineschema zurück. Beim Angeben dieser Direktive können Sie optional einen Zielnamespace-URI angeben, der den angegebenen Namespace im Schema zurückgibt. Weitere Informationen finden Sie unter Generieren eines XSD-Inlineschemas.

ELEMENTS

Gibt an, dass die Spalten als Unterelemente zurückgegeben werden. Andernfalls werden sie XML-Attributen zugeordnet. Diese Option wird nur in den Modi RAW, AUTO und PATH unterstützt. Weitere Informationen finden Sie unter Verwenden des RAW-Modus mit FOR XML.

XSINIL

Gibt an, dass ein Element mit xsi:nil Attribut auf True festgelegt für NULL Spaltenwerte erstellt werden soll. Diese Option kann nur mit ELEMENTS Direktive angegeben werden. Weitere Informationen finden Sie unter

ABSENT

Gibt an, dass für NULL Spaltenwerte die entsprechenden XML-Elemente nicht im XML-Ergebnis hinzugefügt werden. Diese Option kann nur mit der ELEMENTS-Direktive angegeben werden.

PATH [ ('ElementName') ]

Generiert einen <row> Elementwrapper für jede Zeile im Resultset. Optional können Sie einen Elementnamen für den <row> Elementwrapper angeben. Wenn eine leere Zeichenfolge bereitgestellt wird, z. B. FOR XML PATH ('') ), wird kein Wrapperelement generiert. Die Verwendung von PATH bietet möglicherweise eine einfachere Alternative zu Abfragen, die mithilfe der EXPLICIT-Direktive geschrieben wurden. Weitere Informationen finden Sie unter Verwenden des PATH-Modus mit FOR XML.

BINARY BASE64

Gibt an, dass die Abfrage die Binärdaten im BINARY BASE64-Format codiert zurückgibt. Wenn Sie Binärdaten mithilfe von RAW und EXPLICIT Modus abrufen, muss diese Option angegeben werden. Dies ist die Standardeinstellung im AUTO Modus.

TYPE

Gibt an, dass die Abfrage Ergebnisse als XML-Typ zurückgibt. Weitere Informationen finden Sie unter TYPE Directive in FOR XML Queries.

ROOT [ ('RootName') ]

Gibt an, dass ein einzelnes Element der obersten Ebene dem als Ergebnis zurückgegebenen XML-Dokument hinzugefügt wird. Optional können Sie den zu generierenden Stammelementnamen angeben. Wenn der optionale Stammname nicht angegeben ist, wird das standardmäßige <root> Element hinzugefügt.

Weitere Informationen finden Sie unter FOR XML (SQL Server).

Beispiel

Im folgenden Beispiel wird FOR XML AUTO mit den Optionen TYPE und XMLSCHEMA angegeben. Aufgrund der TYPE-Option wird das Resultset als XML-Typ an den Client zurückgegeben. Die XMLSCHEMA-Option gibt an, dass das XSD-Inlineschema in den zurückgegebenen XML-Daten enthalten ist, während die ELEMENTS-Option angibt, dass das XML-Ergebnis elementzentriert ist.

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;  

FOR JSON

Bemerkungen

In Fabric Data Warehouse muss FOR JSON der letzte Operator in der Abfrage sein und ist daher innerhalb von Unterabfragen nicht zulässig.

JSON

Geben Sie FOR JSON an, um die Ergebnisse einer als JSON-Text formatierten Abfrage zurückzugeben. Zudem müssen Sie einen der folgenden JSON-Modi angeben: AUTO oder PATH. Weitere Informationen zur FOR JSON-Klausel finden Sie unter Formatieren von Abfrageergebnissen als JSON mit FOR JSON (SQL Server).

AUTO

Formatieren Sie die JSON-Ausgabe automatisch basierend auf der Struktur der SELECT-Anweisung, indem Sie FOR JSON AUTOangeben. Weitere Informationen und Beispiele finden Sie unter Automatisches Formatieren von JSON-Ausgaben (SQL Server).

PATH

Rufen Sie die vollständige Kontrolle über das Format der JSON-Ausgabe ab, indem Sie FOR JSON PATHangeben. mit PATH Modus können Sie Wrapperobjekte erstellen und komplexe Eigenschaften schachteln. Weitere Informationen und Beispiele finden Sie unter Formatieren einer geschachtelten JSON-Ausgabe im PATH-Modus (SQL Server).

INCLUDE_NULL_VALUES

Schließen Sie NULL Werte in die JSON-Ausgabe ein, indem Sie die option INCLUDE_NULL_VALUES mit der FOR JSON-Klausel angeben. Wenn Sie diese Option nicht angeben, enthält die Ausgabe keine JSON-Eigenschaften für NULL Werte in den Abfrageergebnissen. Weitere Informationen und Beispiele finden Sie unter Einschließen von NULL-Werten in die JSON-Ausgabe mit der Option INCLUDE_NULL_VALUES (SQL Server).

ROOT [ ('RootName') ]

Fügen Sie der JSON-Ausgabe ein einzelnes Element auf oberster Ebene hinzu, indem Sie die option ROOT mit der FOR JSON-Klausel angeben. Wenn Sie die Option ROOT nicht angeben, verfügt die JSON-Ausgabe nicht über ein Stammelement. Weitere Informationen und Beispiele finden Sie unter Hinzufügen eines Stammknotens zur JSON-Ausgabe mithilfe der ROOT-Option (SQL Server).

WITHOUT_ARRAY_WRAPPER

Entfernen Sie die eckigen Klammern, die die JSON-Ausgabe standardmäßig umgeben, indem Sie die Option WITHOUT_ARRAY_WRAPPER mit der FOR JSON-Klausel angeben. Wenn Sie diese Option nicht angeben, wird die JSON-Ausgabe in eckige Klammern eingeschlossen. Verwenden Sie die Option WITHOUT_ARRAY_WRAPPER, um ein einzelnes JSON-Objekt als Ausgabe zu generieren. Weitere Informationen finden Sie unter Entfernen von rechteckigen Klammern von JSON-Ausgabe mit der Option WITHOUT_ARRAY_WRAPPER (SQL Server).

Weitere Informationen finden Sie unter Formatieren von Abfrageergebnissen als JSON mit FOR JSON (SQL Server).