Freigeben über


FOR-Klausel (Transact-SQL)

Mit der FOR-Klausel wird entweder die BROWSE- oder die XML-Option angegeben. Die Optionen BROWSE und XML stehen nicht miteinander in Beziehung.

Wichtiger HinweisWichtig

Die XMLDATA-Direktive zur FOR XML-Option 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 zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

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

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

Argumente

  • 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.

    HinweisHinweis

    <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.

    HinweisHinweis

    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. Um im Durchsuchenmodus auf eine SQL Server-Tabelle in der Anwendung zuzugreifen, sollten Sie eine der beiden folgenden Optionen verwenden:

    • Die SELECT-Anweisung, die Sie verwenden, um auf die Daten aus der SQL Server-Tabelle zuzugreifen, muss mit den Schlüsselwörtern FOR BROWSE enden. Wenn Sie die Option FOR BROWSE aktivieren, um den Durchsuchenmodus zu verwenden, 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, als ob die Option FOR BROWSE an die Anweisungen angefügt würde. Die Option NO_BROWSETABLE erstellt jedoch nicht die temporären Tabellen, die die Option FOR BROWSE im Allgemeinen verwendet, um die Ergebnisse an die 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 Joinanweisung enthält, und wenn ein eindeutiger Index für die Tabelle definiert ist, die sich innerhalb des äußeren Joins befindet, wird der eindeutige Index durch den Durchsuchenmodus nicht unterstützt. Der eindeutige Index wird durch den Durchsuchenmodus nur dann unterstützt, wenn alle eindeutigen Indexschlüsselspalten NULL-Werte annehmen 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 Joinanweisung 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 der Bezeichnung SampleDB.

    2. Erstellen Sie in der SampleDB-Datenbank eine Tabelle "tlinks" und eine Tabelle "trechts", die beide eine einzelne Spalte mit der Bezeichnung "c1" enthalten. Definieren Sie für die c1-Spalte in der Tabelle tlinks einen eindeutigen Index, und legen Sie fest, dass die Spalte NULL-Werte annehmen kann. 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 Tabelle tlinks und die Tabelle trechts ein. Stellen Sie sicher, dass Sie einen NULL-Wert in die Tabelle tlinks 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 mit einem äußeren Join in der SELECT-Abfrage auf die Daten in der Tabelle tlinks und der Tabelle trechts zu. Stellen Sie sicher, dass sich die Tabelle tlinks innerhalb der äußeren Joinanweisung 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 Ergebnisbereich:

      c1

      ----

      NULL

      NULL

    Nach dem Ausführen der SELECT-Abfrage zum Zugreifen auf die Tabellen im Durchsuchenmodus, enthält das Resultset der SELECT-Abfrage aufgrund der Definition der rechten äußeren Joinanweisung zwei Nullwerte für die Spalte c1 in der Tabelle tlinks. Daher können Sie im Resultset nicht zwischen den Nullwerten, die aus der Tabelle stammen, und den Nullwerten, die durch die rechte äußere Joinanweisung eingebracht wurden, unterscheiden. Sie könnten falsche Ergebnisse erhalten, wenn Sie die Nullwerte aus dem Resultset ignorieren müssen.

    HinweisHinweis

    Wenn die Spalten, die in dem eindeutigen Index enthalten sind, keine Nullwerte annehmen können, wurden alle Nullwerte im Ergebnis durch die rechte äußere Joinanweisung eingebracht.

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

  • RAW [ ('ElementName') ]
    Verwendet das Abfrageergebnis und transformiert jede Zeile des Resultsets in ein XML-Element mit dem generischen Bezeichner <row /> als Elementtag. Sie können optional einen Namen für das Zeilenelement angeben. Die XML-Ausgabe verwendet den angegebenen ElementName als das für jede Zeile generierte Zeilenelement. Weitere Informationen finden Sie unter Verwenden des RAW-Modus mit FOR XML und Verwenden des RAW-Modus mit FOR XML.

  • AUTO
    Gibt Abfrageergebnisse in einer einfachen, geschachtelten XML-Struktur zurück. Jede Tabelle in der FROM-Klausel, aus der mindestens eine Spalte in der SELECT-Klausel aufgeführt ist, wird als ein XML-Element dargestellt. Die in der SELECT-Klausel aufgelisteten 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 jedoch auf eine bestimmte Weise geschrieben werden, sodass zusätzliche Informationen über die gewünschte 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.

  • 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, dessen xsi:nil-Attribut auf True festgelegt ist, für NULL-Spaltenwerte erstellt wird. Diese Option kann nur mit der ELEMENTS-Direktive angegeben werden. Weitere Informationen finden Sie unter Generieren von NULL-Werten mithilfe des XSINIL-Parameters.

  • ABSENT
    Gibt an, dass dem XML-Ergebnis für NULL-Spaltenwerte keine entsprechenden XML-Elemente 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. Sie können optional einen Elementnamen für den <row>-Elementwrapper angeben. Bei einer leeren Zeichenfolge, wie z. B. FOR XML PATH ('') ), wird kein Wrapperelement generiert. Die Verwendung von PATH kann eine einfachere Alternative zu mithilfe der EXPLICIT-Direktive geschriebenen Abfragen darstellen. 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. Zum Abrufen von Binärdaten im RAW- oder EXPLICIT-Modus muss diese Option angegeben werden. Im AUTO-Modus ist sie die Standardeinstellung.

  • TYPE
    Gibt an, dass die Abfrage Ergebnisse als xml-Typ zurückgibt. Weitere Informationen finden Sie unter TYPE-Direktive in FOR XML-Abfragen.

  • 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. Wird der optionale Stammelementname nicht angegeben, wird das <root>-Standardelement hinzugefügt.

Beispiele

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 AdventureWorks2012;
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;

Siehe auch

Verweis

SELECT (Transact-SQL)

FOR XML (SQL Server)