SELECT – FOR Clause (Transact-SQL)
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-analysslutpunkt i Microsoft Fabric
Warehouse i Microsoft Fabric
SQL-databas i Microsoft Fabric
Använd FOR-satsen för att ange något av följande alternativ för frågeresultat.
Tillåt uppdateringar när du visar frågeresultat i en markör för bläddra-läge genom att ange
FOR BROWSE
.Formatera frågeresultat som XML genom att ange
FOR XML
.Formatera frågeresultat som JSON genom att ange
FOR JSON
.
Transact-SQL syntaxkonventioner
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 ]
]
}
FÖR BLÄDDRA
BLÄDDRA
Anger att uppdateringar tillåts när du visar data i en DB-Library markör för bläddra-läge. En tabell kan bläddras i ett program om tabellen innehåller en tidsstämpel kolumn, tabellen har ett unikt index och alternativet FOR BROWSE är i slutet av SELECT-uttrycken som skickas till en instans av SQL Server.
Not
Du kan inte använda <lock_hint> HOLDLOCK i en SELECT-instruktion som innehåller alternativet FOR BROWSE.
FÖR BLÄDDRA kan inte visas i SELECT-instruktioner som är anslutna av UNION-operatorn.
Not
När de unika indexnyckelkolumnerna i en tabell är nullbara och tabellen finns på den inre sidan av en yttre koppling, stöds inte indexet i bläddra-läge.
Med bläddra-läget kan du skanna raderna i SQL Server-tabellen och uppdatera data i tabellen en rad i taget. Om du vill komma åt en SQL Server-tabell i ditt program i bläddra-läget måste du använda något av följande två alternativ:
SELECT-instruktionen som du använder för att komma åt data från SQL Server-tabellen måste sluta med nyckelorden FOR BROWSE. När du aktiverar alternativet FÖR BLÄDDRA för att använda sökläge skapas tillfälliga tabeller.
Du måste köra följande Transact-SQL-instruktion för att aktivera bläddra-läget med hjälp av alternativet NO_BROWSETABLE:
SET NO_BROWSETABLE ON
När du aktiverar alternativet NO_BROWSETABLE fungerar alla SELECT-instruktioner som om alternativet FÖR BLÄDDRA läggs till i -instruktionerna. Men alternativet NO_BROWSETABLE skapar inte de temporära tabeller som alternativet FÖR BLÄDDRA vanligtvis använder för att skicka resultatet till ditt program.
När du försöker komma åt data från SQL Server-tabeller i bläddra-läge med hjälp av en SELECT-fråga som involverar en yttre kopplingsinstruktor, och när ett unikt index definieras i tabellen som finns på den inre sidan av en yttre kopplingsinstruktor, stöder inte browse-läget det unika indexet. Bläddra-läget stöder endast det unika indexet när alla unika indexnyckelkolumner kan acceptera NULL
värden. Browse-läget stöder inte det unika indexet om följande villkor är uppfyllda:
Du försöker komma åt data från SQL Server-tabeller i sökläge med hjälp av en SELECT-fråga som omfattar en yttre kopplingsinstruktor.
Ett unikt index definieras i tabellen som finns på den inre sidan av en yttre kopplingsinstrukment.
Följ dessa steg för att återskapa det här beteendet i bläddra-läget:
I SQL Server Management Studio skapar du en databas med namnet
SampleDB
.I databasen
SampleDB
skapar du entleft
-tabell och entright
tabell som båda innehåller en enda kolumn med namnetc1
. Definiera ett unikt index för kolumnenc1
i tabellentleft
och ange att kolumnen ska accepteraNULL
värden. Det gör du genom att köra följande Transact-SQL-instruktioner i ett lämpligt frågefönster:CREATE TABLE tleft(c1 INT NULL UNIQUE) ; GO CREATE TABLE tright(c1 INT NULL) ; GO
Infoga flera värden i tabellen
tleft
och tabellentright
. Kontrollera att du infogar ettNULL
värde i tabellentleft
. Det gör du genom att köra följande Transact-SQL-instruktioner i frågefönstret: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
Aktivera alternativet
NO_BROWSETABLE
. Det gör du genom att köra följande Transact-SQL-instruktioner i frågefönstret:SET NO_BROWSETABLE ON ; GO
Få åtkomst till data i tabellen
tleft
och tabellentright
med hjälp av en yttre kopplingsuttryck i fråganSELECT
. Kontrollera att tabellentleft
finns på den inre sidan av den yttre kopplingssatsen. Det gör du genom att köra följande Transact-SQL-instruktioner i frågefönstret:SELECT tleft.c1 FROM tleft RIGHT JOIN tright ON tleft.c1 = tright.c1 WHERE tright.c1 <> 2 ;
Observera följande utdata i fönstret Resultat:
c1 --- NULL NULL
När du har kört den SELECT
frågan för att komma åt tabellerna i bläddra-läget innehåller resultatuppsättningen för den SELECT
frågan två NULL
värden för kolumnen c1
i tleft
-tabellen på grund av definitionen av den högra yttre kopplingsinstrukmentet. I resultatuppsättningen kan du därför inte skilja mellan de NULL
värden som kom från tabellen och de NULL
värden som den högra yttre kopplingssatsen introducerade. Du kan få felaktiga resultat om du måste ignorera NULL
värden från resultatuppsättningen.
Not
Om kolumnerna som ingår i det unika indexet inte accepterar NULL
värden introducerades alla NULL
värden i resultatuppsättningen av den högra yttre kopplingssatsen.
FÖR XML
XML
Anger att resultatet av en fråga ska returneras som ett XML-dokument. Något av följande XML-lägen måste anges: RAW
, AUTO
, EXPLICIT
. Mer information om XML-data och SQL Server finns i FÖR XML (SQL Server).
RAW [ ("ElementName') ]
Tar frågeresultatet och transformerar varje rad i resultatuppsättningen till ett XML-element med en allmän identifierare <row />
som elementtagg. Du kan också ange ett namn för radelementet. Resultatet av XML-utdata använder den angivna ElementName
som radelementet som genereras för varje rad. Mer information finns i Använda RAW-läge med FÖR XML-.
BIL
Returnerar frågeresultat i ett enkelt kapslat XML-träd. Varje tabell i FROM
-satsen, för vilken minst en kolumn visas i SELECT
-satsen, representeras som ett XML-element. Kolumnerna som anges i SELECT
-satsen mappas till lämpliga elementattribut. Mer information finns i Använda autoläge med FÖR XML-.
EXPLICIT
Anger att formen på det resulterande XML-trädet definieras explicit. Med det här läget måste frågor skrivas på ett visst sätt så att ytterligare information om önskad kapsling anges explicit. Mer information finns i Använda explicit läge med FÖR XML-.
XMLDATA
Returnerar infogat XDR-schema, men lägger inte till rotelementet i resultatet. Om XMLDATA
anges läggs XDR-schemat till i dokumentet.
Viktig
XMLDATA
-direktivet är inaktuellt. Använd XSD-generering när det gäller RAW- och AUTO-lägen. Det finns ingen ersättning för XMLDATA
-direktivet i EXPLICIT
läge. Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.
Ignorera oönskade radbrytningar: Du kan använda SQL Server Management Studio (SSMS) för att utfärda en fråga som använder FOR XML
-satsen. Ibland returneras en stor mängd XML och visas i en rutnätscell. XML-strängen kan vara längre än en SSMS-rutnätscell kan innehålla på en enda rad. I dessa fall kan SSMS infoga radbrytningstecken mellan långa segment i hela XML-strängen. Sådana radbrytningar kan inträffa mitt i en delsträng som inte ska delas över linjer. Du kan förhindra radbrytningar med hjälp av en gjuten AS XMLDATA
. Den här lösningen kan också användas när du använder FOR JSON PATH
, som i följande Transact-SQL exempel på SELECT
-instruktion:
SELECT CAST(
(SELECT column1, column2
FROM my_table
FOR XML PATH('')
)
AS VARCHAR(MAX)
) AS XMLDATA ;
XMLSCHEMA [ ("TargetNameSpaceURI') ]
Returnerar infogat XSD-schema. Du kan också ange en målnamnområdes-URI när du anger det här direktivet, som returnerar det angivna namnområdet i schemat. Mer information finns i Generera ett infogat XSD-schema.
ELEMENT
Anger att kolumnerna returneras som underelement. Annars mappas de till XML-attribut. Det här alternativet stöds endast i lägena RAW
, AUTO
och PATH
. Mer information finns i Använda RAW-läge med FÖR XML-.
XSINIL
Anger att ett element med xsi:nil
attribut inställt på True skapas för NULL
kolumnvärden. Det här alternativet kan bara anges med ELEMENTS
direktiv. Mer information finns i:
FRÅNVARANDE
Anger att motsvarande XML-element inte läggs till i XML-resultatet för NULL
kolumnvärden. Ange endast det här alternativet med ELEMENT.
PATH [ ("ElementName') ]
Genererar en <row>
elementomslutning för varje rad i resultatuppsättningen. Du kan också ange ett elementnamn för <row>
elementomslutning. Om en tom sträng tillhandahålls, till exempel FOR XML PATH ('') )
, genereras inte ett wrapper-element. Att använda PATH
kan vara ett enklare alternativ till frågor som skrivits med hjälp av EXPLICIT
-direktivet. Mer information finns i Använda PATH-läge med FOR XML-.
BINÄR BAS64
Anger att frågan returnerar binära data i binärt base64-kodat format. När du hämtar binära data med hjälp av RAW
och EXPLICIT
läge måste det här alternativet anges. Detta är standardvärdet i AUTO
läge.
TYP
Anger att frågan returnerar resultat som xml- typ. Mer information finns i TYPE-direktivet i FOR XML-frågor.
ROOT [ ("RootName') ]
Anger att ett enda element på den översta nivån ska läggas till i den resulterande XML-koden. Du kan också ange det rotelementnamn som ska genereras. Om det valfria rotnamnet inte har angetts läggs standardelementet <root>
till.
Mer information finns i FOR XML (SQL Server).
Exempel
I följande exempel anges FOR XML AUTO
med alternativen TYPE
och XMLSCHEMA
. På grund av alternativet TYPE
returneras resultatuppsättningen till klienten som en xml- typ. Alternativet XMLSCHEMA
anger att det infogade XSD-schemat ingår i de XML-data som returneras, och alternativet ELEMENTS
anger att XML-resultatet är elementcentrerat.
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;
FÖR JSON
Anmärkningar
I Fabric Data Warehouse måste FOR JSON
vara den sista operatorn i frågan och tillåts därför inte i underfrågor.
JSON
Ange FÖR JSON för att returnera resultatet av en fråga formaterad som JSON-text. Du måste också ange något av följande JSON-lägen: AUTO eller PATH. Mer information om FOR JSON
-satsen finns i Formatera frågeresultat som JSON med FOR JSON (SQL Server).
BIL
Formatera JSON-utdata automatiskt baserat på strukturen för SELECT
-instruktionen genom att ange FOR JSON AUTO
. Mer information och exempel finns i Formatera JSON-utdata automatiskt med AUTO-läge (SQL Server).
STIG
Få fullständig kontroll över formatet för JSON-utdata genom att ange FOR JSON PATH
.
PATH
läge kan du skapa omslutningsobjekt och kapsla komplexa egenskaper. Mer information och exempel finns i Formatera kapslade JSON-utdata med PATH-läge (SQL Server).
INCLUDE_NULL_VALUES
Inkludera NULL
värden i JSON-utdata genom att ange alternativet INCLUDE_NULL_VALUES
med FOR JSON
-satsen. Om du inte anger det här alternativet innehåller inte utdata JSON-egenskaper för NULL
värden i frågeresultatet. Mer information och exempel finns i Include Null Values in JSON Output with the INCLUDE_NULL_VALUES Option (SQL Server).
ROOT [ ("RootName') ]
Lägg till ett enda element på den översta nivån i JSON-utdata genom att ange alternativet ROOT
med FOR JSON
-satsen. Om du inte anger alternativet ROOT
har JSON-utdata inte något rotelement. Mer information och exempel finns i Lägg till en rotnod i JSON-utdata med ROOT-alternativet (SQL Server).
WITHOUT_ARRAY_WRAPPER
Ta bort hakparenteserna som omger JSON-utdata som standard genom att ange alternativet WITHOUT_ARRAY_WRAPPER
med FOR JSON
-satsen. Om du inte anger det här alternativet omges JSON-utdata inom hakparenteser. Använd alternativet WITHOUT_ARRAY_WRAPPER
för att generera ett enda JSON-objekt som utdata. Mer information finns i Ta bort hakparenteser från JSON-utdata med WITHOUT_ARRAY_WRAPPER-alternativet (SQL Server).
Mer information finns i Formatera frågeresultat som JSON med FOR JSON (SQL Server).