SELECT - FOR – klauzule (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLKoncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Klauzule FOR slouží k určení jedné z následujících možností pro výsledky dotazu.

  • Určete FOR BROWSE , že chcete povolit aktualizace při zobrazení výsledků dotazu v kurzoru v režimu procházení.
  • Zadejte FOR XML , aby se výsledky dotazu formátují jako XML.
  • Zadejte FOR JSON , aby se výsledky dotazu formátují jako JSON.

Transact-SQL konvence syntaxe

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 PROHLÍŽENÍ

BROWSE

Určuje, že při prohlížení dat v DB-Library kurzoru v režimu procházení jsou povoleny aktualizace. Tabulku v aplikaci můžete procházet, pokud tabulka obsahuje sloupec časového razítka , tabulka má jedinečný index a možnost FOR BROWSE je na konci SELECT příkazů odesílaných do instance SQL Serveru.

Note

Příkaz, který obsahuje tuto FOR BROWSE možnost, nemůžete použít.<lock_hint> HOLDLOCKSELECT

FOR BROWSEv příkazech, které operátor spojí, UNION se nezobrazujeSELECT.

Note

Pokud jsou sloupce jedinečného indexového klíče tabulky s možnou hodnotou null a tabulka je na vnitřní straně vnějšího spojení, režim procházení index nepodporuje.

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žijete pro přístup k datům z tabulky SQL Serveru, musí končit klíčovými slovy FOR BROWSE. Když zapnete FOR BROWSE možnost použití režimu procházení, vytvoří se dočasné tabulky.

  • Pokud chcete zapnout režim procházení pomocí NO_BROWSETABLE této možnosti, musíte spustit následující příkaz Transact-SQL:

    SET NO_BROWSETABLE ON;
    

    Když tuto možnost zapnete NO_BROWSETABLE , všechny SELECT příkazy se chovají, jako by FOR BROWSE se tato možnost připojila k příkazům. Tato NO_BROWSETABLE možnost ale nevytvoří dočasné tabulky, které FOR BROWSE tato možnost obvykle používá k odeslání výsledků do vaší aplikace.

Když se pokusíte získat přístup k datům z tabulek SQL Serveru v režimu procházení pomocí SELECT dotazu, který zahrnuje OUTER JOIN příkaz, a když je v tabulce, která je na vnitřní straně OUTER JOIN příkazu, definovaný jedinečný index, 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í SELECT dotazu, který zahrnuje OUTER JOIN příkaz.

  • Jedinečný index je definován v tabulce, která se nachází na vnitřní straně OUTER JOIN příkazu.

Chcete-li toto chování reprodukovat v režimu procházení, postupujte takto:

  1. V aplikaci SQL Server Management Studio vytvořte databázi s názvem SampleDB.

  2. SampleDB V databázi vytvořte tleft tabulku a tright tabulku, která obě obsahují jeden sloupec s názvem c1. Definujte jedinečný index pro sloupec c1 v tabulce tleft a nastavte sloupec tak, aby přijímal hodnoty NULL. 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
    
  3. Do tabulky tleft a tabulky tright vložte několik hodnot. Ujistěte se, že do tabulky NULL vložíte hodnotu tleft. 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);
    
  4. 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;
    
  5. Přístup k datům v tabulce tleft a tabulce tright pomocí příkazu vnějšího spojení v dotazu SELECT. Ujistěte se, že je tleft 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 OUTER 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í SELECT dotazu pro přístup k tabulkám v režimu procházení obsahuje sada SELECT výsledků dotazu dvě NULL hodnoty pro c1 sloupec v tleft tabulce kvůli definici RIGHT OUTER JOIN příkazu. Proto v sadě výsledků nemůžete rozlišovat mezi NULL hodnotami, které pocházejí z tabulky, a NULL hodnotami, které RIGHT OUTER JOIN příkaz zavedl. Pokud dotaz musí ignorovat NULL hodnoty ze sady výsledků, může se zobrazit nesprávné výsledky.

Note

Pokud sloupce, které jsou zahrnuty do jedinečného indexu, nepřijímají NULL hodnoty, byly NULL všechny hodnoty v sadě výsledků zavedeny příkazem RIGHT OUTER JOIN .

FOR XML (příkaz používaný pro generování výstupu ve formátu XML)

jazyk 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 s jazykem FOR 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 naleznete v tématu Použití automatického režimu s jazykem XML.

EXPLICIT

Určuje, že tvar výsledného stromu XML je definován explicitně. V tomto režimu musíte zapsat dotazy určitým způsobem, aby explicitně zadaly další informace o požadovaném vnoření. Další informace naleznete v tématu Použití explicitního režimu s jazykem XML.

XMLDATA

Vrátí vložené schéma XDR, ale nepřidá do výsledku kořenový prvek. Pokud zadáte XMLDATA, připojí se k dokumentu schéma XDR.

Important

Direktiva XMLDATA je zastaralá. Používejte generování XSD pro RAW režimy a AUTO režimy. Direktiva XMLDATA v EXPLICIT režimu není nahrazena. 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ů: K spuštění dotazu, který používá FOR XML klauzuli, můžete použít SQL Server Management Studio (SSMS). 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. Takové konce řádků můžou nastat uprostřed podřetětědce, které by neměly být rozdělené mezi řádky. Konce řádků můžete zabránit použitím AS XMLDATApř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 Generování vloženého schématu XSD.

ELEMENTS

Určuje, že sloupce se vrátí jako dílčí prvky. V opačném případě je dotaz mapuje na atributy XML. Tato možnost je podporována pouze v RAWAUTOPATH a režimech. Další informace naleznete v tématu Použití režimu RAW s jazykem FOR XML.

XSINIL

Určuje, že element s atributem xsi:nil nastaveným na Hodnotu True je vytvořen pro NULL hodnoty sloupce. Tuto možnost můžete zadat pouze pomocí direktivy ELEMENTS . Další informace najdete tady:

ABSENT

Označuje, že u NULL hodnot sloupců nejsou do výsledku XML přidány odpovídající elementy XML. Tuto možnost zadejte pouze pomocí parametru ELEMENTS.

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 zadáte prázdný řetězec, například FOR XML PATH ('')), element obálky se negeneruje. Použití PATH může poskytnout jednodušší alternativu k dotazům napsaným pomocí direktivy EXPLICIT. Další informace naleznete v tématu Použití režimu PATH s FOR XML.

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 EXPLICIT režimu je nutné zadat tuto možnost. Tato možnost je výchozí v AUTO režimu.

TYPE

Určuje, že dotaz vrátí výsledky jako xml typ. Další informace naleznete v tématu Direktiva TYPE v dotazech FOR XML.

ROOT [ ('RootName') ]

Určuje, že se do výsledného XML přidá jeden element nejvyšší úrovně. Volitelně můžete zadat název kořenového prvku, který chcete vygenerovat. Pokud nezadáte kořenový název, přidá se výchozí <root> prvek.

Další informace naleznete v tématu FOR XML (SQL Server).

Example

Následující příklad určuje FOR XML AUTO s možnostmi TYPE a XMLSCHEMA. TYPE Vzhledem k možnosti dotaz vrátí výsledek nastavený na klienta 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 AdventureWorks2025;
SELECT p.BusinessEntityID,
       FirstName,
       LastName,
       PhoneNumber AS Phone
FROM Person.Person AS p
     INNER 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

Remarks

Ve službě Fabric Data Warehouse musí dotaz končit textem FOR JSON, takže ho nemůžete použít v poddotazech.

JSON

Zadejte FOR JSON , aby se vrátily 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 najdete v FOR JSON tématu Formátování výsledků dotazu ve formátu JSON pomocí formátu JSON.

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 automaticky pomocí režimu AUTO.

PATH

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 s režimem PATH.

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 Zahrnutí hodnot Null ve formátu JSON – možnost INCLUDE_NULL_VALUES.

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 s možností ROOT.

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 naleznete v Odebrání hranatých závorek z JSON – možnost WITHOUT_ARRAY_WRAPPER.

Další informace najdete v tématu Formátování výsledků dotazu ve formátu JSON ve formátu JSON.