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.
Wichtig |
---|
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. |
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 Aktualisierungen 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 einer äußeren Verknüpfung 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-Anweisung 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, 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 Verknüpfungsanweisung enthält.
Es ist ein eindeutiger Index für die Tabelle definiert, die sich innerhalb einer äußeren Verknüpfungsanweisung befindet.
Um dieses Verhalten im Durchsuchenmodus zu reproduzieren, führen Sie folgende Schritte aus:
Erstellen Sie in SQL Server Management Studio eine Datenbank mit der Bezeichnung SampleDB.
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
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
Aktivieren Sie die Option NO_BROWSETABLE. Führen Sie hierzu die folgenden Transact-SQL-Anweisungen in dem Abfragefenster aus:
SET NO_BROWSETABLE ON ; GO
Greifen Sie mit einer äußeren Verknüpfungsanweisung 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 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 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 Verknüpfungsanweisung 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 Verknüpfungsanweisung eingebracht wurden, unterscheiden. Sie könnten falsche Ergebnisse erhalten, wenn Sie die Nullwerte aus dem Resultset ignorieren müssen.
Hinweis 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 Verknüpfungsanweisung 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 Erstellen von XML mithilfe von FOR XML.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 und Verwenden des RAW-Modus.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.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.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 XSD-Inlineschemagenerierung.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.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.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 AdventureWorks2008R2;
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;