Sdílet prostřednictvím


SELECT - FOR – klauzule (Transact-SQL)

platí pro:SQL ServerAzure SQL Databasekoncový bod služby Azure SQL Managed InstanceSQL Analytics v Microsoft FabricWarehouse v Microsoft Fabricdatabá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.

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

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

  2. V databázi SampleDB vytvořte tabulku tleft a tabulku tright, 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 tleft vložíte hodnotu NULL. 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  
    
  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 ;  
    GO  
    
  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 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 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 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).