SELECT - FOR – klauzule (Transact-SQL)
platí pro:SQL Server
Azure SQL Database
koncový bod služby Azure SQL Managed Instance
SQL Analytics v Microsoft Fabric
Warehouse v Microsoft Fabric
databázi SQL v Microsoft Fabric
Klauzule FOR slouží k určení jedné z následujících možností pro výsledky dotazu.
Povolte aktualizace při prohlížení výsledků dotazu v kurzoru v režimu procházení zadáním
FOR BROWSE
.Formátování výsledků dotazu jako XML zadáním
FOR XML
.Naformátujte výsledky dotazu jako JSON zadáním
FOR JSON
.
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 ]
]
}
PRO PROCHÁZENÍ
PÁST SE
Určuje, že se aktualizace povolí při prohlížení dat v DB-Library kurzoru v režimu procházení. Tabulku je možné procházet v aplikaci, pokud tabulka obsahuje časové razítko sloupec, tabulka má jedinečný index a možnost FOR BROWSE je na konci příkazů SELECT odesílaných do instance SQL Serveru.
Poznámka
V příkazu SELECT, který obsahuje možnost FOR BROWSE, nelze použít <lock_hint> HOLDLOCK.
Příkaz FOR BROWSE nelze zobrazit v příkazech SELECT, které jsou spojené operátorem UNION.
Poznámka
Pokud jsou sloupce jedinečného klíče indexu tabulky s možnou hodnotou null a tabulka je na vnitřní straně vnějšího spojení, režim procházení nepodporuje index.
Režim procházení umožňuje prohledávat řádky v tabulce SQL Serveru a aktualizovat data v tabulce po jednom řádku. Pokud chcete získat přístup k tabulce SQL Serveru v aplikaci v režimu procházení, musíte použít jednu z následujících dvou možností:
Příkaz SELECT, který používáte pro přístup k datům z tabulky SQL Serveru, musí končit klíčovými slovy FOR BROWSE. Když zapnete možnost PRO PROCHÁZENÍ pro použití režimu procházení, vytvoří se dočasné tabulky.
Pokud chcete zapnout režim procházení pomocí možnosti NO_BROWSETABLE, musíte spustit následující příkaz Transact-SQL:
SET NO_BROWSETABLE ON
Když zapnete možnost NO_BROWSETABLE, všechny příkazy SELECT se chovají stejně, jako by k příkazům byla připojena možnost FOR BROWSE. Možnost NO_BROWSETABLE však nevytvoří dočasné tabulky, které pro procházení obecně používá k odeslání výsledků do vaší aplikace.
Při pokusu o přístup k datům z tabulek SQL Serveru v režimu procházení pomocí dotazu SELECT, který zahrnuje příkaz vnější spojení, a když je v tabulce, která je přítomna na vnitřní straně příkazu vnějšího spojení, režim procházení nepodporuje jedinečný index. Režim procházení podporuje jedinečný index pouze v případech, kdy všechny sloupce s jedinečnými klíči indexu můžou přijímat NULL
hodnoty. Režim procházení nepodporuje jedinečný index, pokud jsou splněny následující podmínky:
Pokusíte se získat přístup k datům z tabulek SQL Serveru v režimu procházení pomocí dotazu SELECT, který zahrnuje příkaz vnějšího spojení.
Jedinečný index je definován v tabulce, která se nachází na vnitřní straně příkazu vnějšího spojení.
Chcete-li toto chování reprodukovat v režimu procházení, postupujte takto:
V aplikaci SQL Server Management Studio vytvořte databázi s názvem
SampleDB
.V databázi
SampleDB
vytvořte tabulkutleft
a tabulkutright
, která obě obsahují jeden sloupec s názvemc1
. Definujte jedinečný index pro sloupecc1
v tabulcetleft
a nastavte sloupec tak, aby přijímal hodnotyNULL
. Uděláte to tak, že v příslušném okně dotazu spustíte následující příkazy Transact-SQL:CREATE TABLE tleft(c1 INT NULL UNIQUE) ; GO CREATE TABLE tright(c1 INT NULL) ; GO
Do tabulky
tleft
a tabulkytright
vložte několik hodnot. Ujistěte se, že do tabulkytleft
vložíte hodnotuNULL
. Uděláte to tak, že v okně dotazu spustíte následující příkazy Transact-SQL: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
Zapněte možnost
NO_BROWSETABLE
. Uděláte to tak, že v okně dotazu spustíte následující příkazy Transact-SQL:SET NO_BROWSETABLE ON ; GO
Přístup k datům v tabulce
tleft
a tabulcetright
pomocí příkazu vnějšího spojení v dotazuSELECT
. Ujistěte se, že jetleft
tabulka na vnitřní straně příkazu vnějšího spojení. Uděláte to tak, že v okně dotazu spustíte následující příkazy Transact-SQL:SELECT tleft.c1 FROM tleft RIGHT JOIN tright ON tleft.c1 = tright.c1 WHERE tright.c1 <> 2 ;
Všimněte si následujícího výstupu v podokně výsledky:
c1 --- NULL NULL
Po spuštění dotazu SELECT
pro přístup k tabulkám v režimu procházení obsahuje sada výsledků dotazu SELECT
dvě NULL
hodnoty pro sloupec c1
v tabulce tleft
z důvodu definice pravého příkazu vnějšího spojení. Proto v sadě výsledků nelze rozlišovat mezi NULL
hodnotami, které pocházejí z tabulky, a NULL
hodnoty, které zavedl příkaz pravé vnější spojení. Pokud je nutné ignorovat hodnoty NULL
ze sady výsledků, může se zobrazit nesprávné výsledky.
Poznámka
Pokud sloupce zahrnuté do jedinečného indexu nepřijímají NULL
hodnoty, byly všechny NULL
hodnoty v sadě výsledků zavedeny příkazem pravého vnějšího spojení.
FOR XML
XML
Určuje, že výsledky dotazu mají být vráceny jako dokument XML. Je třeba zadat jeden z následujících režimů XML: RAW
, AUTO
, EXPLICIT
. Další informace o datech XML a SQL Serveru naleznete v tématu FOR XML (SQL Server).
RAW [ ('ElementName') ]
Vezme výsledek dotazu a transformuje každý řádek v sadě výsledků do elementu XML s obecným identifikátorem <row />
jako značku elementu. Volitelně můžete zadat název prvku řádku. Výsledný výstup XML používá zadaný ElementName
jako prvek řádku vygenerovaný pro každý řádek. Další informace naleznete v tématu Použití REŽIMU RAW sFOR XML .
AUTO
Vrátí výsledky dotazu v jednoduchém vnořeném stromu XML. Každá tabulka v klauzuli FROM
, pro kterou je v klauzuli SELECT
uveden alespoň jeden sloupec, je reprezentována jako element XML. Sloupce uvedené v klauzuli SELECT
jsou mapovány na příslušné atributy elementu. Další informace najdete v tématu Použití automatického režimu sXML .
EXPLICITNÍ
Určuje, že tvar výsledného stromu XML je definován explicitně. Pomocí tohoto režimu musí být dotazy zapsány určitým způsobem, aby byly explicitně zadány další informace o požadovaném vnoření. Další informace naleznete v tématu Použití explicitního režimu sFOR XML .
XMLDATA
Vrátí vložené schéma XDR, ale nepřidá kořenový prvek do výsledku. Pokud je zadán XMLDATA
, připojí se k dokumentu schéma XDR.
Důležitý
Direktiva XMLDATA
je zastaralé. Generování XSD použijte v případě režimů RAW a AUTO. Direktiva XMLDATA
v režimu EXPLICIT
neexistuje. Tato funkce bude odebrána v budoucí verzi SQL Serveru. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.
Potlačení nežádoucích konců řádků: Sql Server Management Studio (SSMS) můžete použít k vydání dotazu, který používá klauzuli FOR XML
. Někdy se vrátí velké množství XML a zobrazí se v jedné buňce mřížky. Řetězec XML může být delší než jedna buňka mřížky SSMS, která může obsahovat jeden řádek. V těchto případech může SSMS vložit znaky zalomení řádku mezi dlouhé segmenty celého řetězce XML. Tyto konce řádků mohou nastat uprostřed podřetětěce, které by neměly být rozděleny mezi čáry. Konce řádků můžete zabránit použitím AS XMLDATA
přetypování . Toto řešení se také může použít při použití FOR JSON PATH
, jako v následujícím ukázkovém příkazu Transact-SQL SELECT
:
SELECT CAST(
(SELECT column1, column2
FROM my_table
FOR XML PATH('')
)
AS VARCHAR(MAX)
) AS XMLDATA ;
XMLSCHEMA [ ('TargetNameSpaceURI') ]
Vrátí vložené schéma XSD. Pokud zadáte tuto direktivu, můžete volitelně zadat identifikátor URI cílového oboru názvů, který vrátí zadaný obor názvů ve schématu. Další informace naleznete v tématu vygenerování vloženého schématu XSD.
ELEMENTY
Určuje, že sloupce se vrátí jako dílčí prvky. Jinak se mapují na atributy XML. Tato možnost je podporována pouze v režimech RAW
, AUTO
a PATH
. Další informace naleznete v tématu Použití REŽIMU RAW sFOR XML .
XSINIL
Určuje, že prvek s atributem xsi:nil
nastaveným na hodnotu True pro hodnoty sloupce NULL
. Tuto možnost lze zadat pouze pomocí direktivy ELEMENTS
. Další informace najdete tady:
NEPŘÍTOMNÝ
Označuje, že pro NULL
hodnoty sloupce, odpovídající elementy XML nebudou přidány ve výsledku XML. Tuto možnost zadejte pouze pomocí elementů.
PATH [ ('ElementName') ]
Vygeneruje obálku elementu <row>
pro každý řádek v sadě výsledků. Volitelně můžete zadat název elementu pro obálku elementu <row>
. Pokud je k dispozici prázdný řetězec, například FOR XML PATH ('') )
, element obálky není generován. Použití PATH
může poskytnout jednodušší alternativu k dotazům napsaným pomocí direktivy EXPLICIT
. Další informace najdete v tématu Použití režimu PATH sXML .
BINARY BASE64
Určuje, že dotaz vrátí binární data v binárním formátu kódování base64. Při načítání binárních dat pomocí RAW
a režimu EXPLICIT
musí být tato možnost zadána. Toto je výchozí nastavení v režimu AUTO
.
TYP
Určuje, že dotaz vrátí výsledky jako xml typ. Další informace naleznete v tématu TYPE Direktiva v dotazech FOR XML.
ROOT [ ('RootName') ]
Určuje, že do výsledného XML se přidá jeden element nejvyšší úrovně. Volitelně můžete zadat název kořenového elementu, který se má vygenerovat. Pokud není zadán volitelný kořenový název, přidá se výchozí prvek <root>
.
Další informace najdete v tématu FOR XML (SQL Server).
Příklad
Následující příklad určuje FOR XML AUTO
s možnostmi TYPE
a XMLSCHEMA
. Z důvodu TYPE
možnosti se sada výsledků vrátí klientovi jako typ xml. Možnost XMLSCHEMA
určuje, že vložené schéma XSD je součástí vrácených dat XML a ELEMENTS
možnost určuje, že výsledek XML je orientovaný na element.
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;
PRO JSON
Poznámky
V datovém skladu fabric musí být FOR JSON
posledním operátorem v dotazu, takže v poddotazech není povolený.
JSON
Zadáním příkazu FOR JSON vrátíte výsledky dotazu formátovaného jako text JSON. Musíte také zadat jeden z následujících režimů JSON: AUTO nebo PATH. Další informace o klauzuli FOR JSON
najdete v tématu Formát výsledků dotazu jako JSON sFOR JSON (SQL Server).
AUTO
Naformátujte výstup JSON automaticky na základě struktury příkazu SELECT
zadáním FOR JSON AUTO
. Další informace a příklady najdete v tématu Automatické formátování výstupu JSON pomocí automatického režimu (SQL Server).
CESTA
Získejte úplnou kontrolu nad formátem výstupu JSON zadáním FOR JSON PATH
. režim PATH
umožňuje vytvářet objekty obálky a vnořit složité vlastnosti. Další informace a příklady najdete v tématu Formátování vnořeného výstupu JSON pomocí režimu PATH (SQL Server).
INCLUDE_NULL_VALUES
Do výstupu JSON zahrňte NULL
hodnoty zadáním možnosti INCLUDE_NULL_VALUES
pomocí klauzule FOR JSON
. Pokud tuto možnost nezadáte, výstup neobsahuje vlastnosti JSON pro NULL
hodnoty ve výsledcích dotazu. Další informace a příklady najdete v tématu Zahrnout hodnoty Null ve výstupu JSON smožnost INCLUDE_NULL_VALUES (SQL Server).
ROOT [ ('RootName') ]
Do výstupu JSON přidejte jeden element nejvyšší úrovně zadáním možnosti ROOT
s klauzulí FOR JSON
. Pokud nezadáte možnost ROOT
, výstup JSON nemá kořenový prvek. Další informace a příklady najdete v tématu Přidání kořenového uzlu do výstupu JSON pomocíROOT Option (SQL Server).
WITHOUT_ARRAY_WRAPPER
Ve výchozím nastavení odeberte hranaté závorky obklopující výstup JSON zadáním možnosti WITHOUT_ARRAY_WRAPPER
pomocí klauzule FOR JSON
. Pokud tuto možnost nezadáte, výstup JSON se uzavře do hranatých závorek. K vygenerování jednoho objektu JSON jako výstupu použijte možnost WITHOUT_ARRAY_WRAPPER
. Další informace najdete v tématu Odebrání hranatých závorek z výstupu JSON pomocíWITHOUT_ARRAY_WRAPPER Option (SQL Server).
Další informace najdete v tématu Formátování výsledků dotazu ve formátu JSON sFOR JSON (SQL Server).
Související obsah
- SELECT (Transact-SQL)
- Použití výstupu FOR JSON na SQL Serveru a v klientských aplikacích