Udostępnij za pośrednictwem


SELECT — FOR, klauzula (Transact-SQL)

Dotyczy:SQL ServerAzure SQL Databasepunkt końcowy analizy SQL usługi Azure SQLSQL w usłudze Microsoft FabricWarehouse w usłudze Microsoft FabricSQL Database w usłudze Microsoft Fabric

Użyj klauzuli FOR, aby określić jedną z następujących opcji dla wyników zapytania.

  • Zezwalaj na aktualizacje podczas wyświetlania wyników zapytania w kursorze trybu przeglądania, określając FOR BROWSE.

  • Formatuj wyniki zapytania jako XML, określając FOR XML.

  • Sformatuj wyniki zapytania w formacie JSON, określając FOR JSON.

Transact-SQL konwencje składni

Składnia

[ 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 ]  
    ]  

}

DO PRZEGLĄDANIA

PRZEGLĄDAĆ

Określa, że aktualizacje mogą być dozwolone podczas wyświetlania danych w DB-Library kursor trybu przeglądania. Tabelę można przeglądać w aplikacji, jeśli tabela zawiera sygnaturę czasową kolumny, tabela ma unikatowy indeks, a opcja PRZEGLĄDAJ na końcu instrukcji SELECT wysyłanych do wystąpienia programu SQL Server.

Nuta

Nie można użyć <lock_hint> HOLDLOCK w instrukcji SELECT, która zawiera opcję FOR BROWSE.

W przypadku opcji BROWSE nie można wyświetlić w instrukcjach SELECT, które są przyłączone przez operatora UNION.

Nuta

Gdy unikatowe kolumny klucza indeksu tabeli są dopuszczane do wartości null, a tabela znajduje się po wewnętrznej stronie sprzężenia zewnętrznego, indeks nie jest obsługiwany przez tryb przeglądania.

Tryb przeglądania umożliwia skanowanie wierszy w tabeli programu SQL Server i aktualizowanie danych w tabeli po jednym wierszu jednocześnie. Aby uzyskać dostęp do tabeli programu SQL Server w aplikacji w trybie przeglądania, należy użyć jednej z następujących dwóch opcji:

  • Instrukcja SELECT używana do uzyskiwania dostępu do danych z tabeli programu SQL Server musi kończyć się słowami kluczowymi NA potrzeby przeglądania. Po włączeniu przeglądania opcji przeglądania są tworzone tabele tymczasowe.

  • Aby włączyć tryb przeglądania przy użyciu opcji NO_BROWSETABLE, należy uruchomić następującą instrukcję Transact-SQL:

    SET NO_BROWSETABLE ON  
    

    Po włączeniu opcji NO_BROWSETABLE wszystkie instrukcje SELECT zachowują się tak, jakby do instrukcji dołączono opcję BROWSE. Jednak opcja NO_BROWSETABLE nie tworzy tabel tymczasowych, których zazwyczaj używa opcja PRZEGLĄDANIa do wysyłania wyników do aplikacji.

Podczas próby uzyskania dostępu do danych z tabel programu SQL Server w trybie przeglądania przy użyciu zapytania SELECT, które obejmuje instrukcję sprzężenia zewnętrznego, a gdy unikatowy indeks jest zdefiniowany w tabeli, która znajduje się po wewnętrznej stronie instrukcji sprzężenia zewnętrznego, tryb przeglądania nie obsługuje indeksu unikatowego. Tryb przeglądania obsługuje unikatowy indeks tylko wtedy, gdy wszystkie unikatowe kolumny klucza indeksu mogą akceptować NULL wartości. Tryb przeglądania nie obsługuje indeksu unikatowego, jeśli spełnione są następujące warunki:

  • Próbujesz uzyskać dostęp do danych z tabel programu SQL Server w trybie przeglądania przy użyciu zapytania SELECT, które obejmuje instrukcję sprzężenia zewnętrznego.

  • Unikatowy indeks jest definiowany w tabeli, która znajduje się po wewnętrznej stronie instrukcji sprzężenia zewnętrznego.

Aby odtworzyć to zachowanie w trybie przeglądania, wykonaj następujące kroki:

  1. W programie SQL Server Management Studio utwórz bazę danych o nazwie SampleDB.

  2. W bazie danych SampleDB utwórz tabelę tleft i tabelę tright zawierającą jedną kolumnę o nazwie c1. Zdefiniuj unikatowy indeks w kolumnie c1 w tabeli tleft i ustaw kolumnę tak, aby akceptowała NULL wartości. W tym celu uruchom następujące instrukcje Transact-SQL w odpowiednim oknie zapytania:

    CREATE TABLE tleft(c1 INT NULL UNIQUE) ;  
    GO   
    CREATE TABLE tright(c1 INT NULL) ;  
    GO  
    
  3. Wstaw kilka wartości w tabeli tleft i tabeli tright. Upewnij się, że w tabeli tleft wstawisz wartość NULL. W tym celu uruchom następujące instrukcje Transact-SQL w oknie zapytania:

    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. Włącz opcję NO_BROWSETABLE. W tym celu uruchom następujące instrukcje Transact-SQL w oknie zapytania:

    SET NO_BROWSETABLE ON ;  
    GO  
    
  5. Uzyskaj dostęp do danych w tabeli tleft i tabeli tright przy użyciu instrukcji sprzężenia zewnętrznego w zapytaniu SELECT. Upewnij się, że tabela tleft znajduje się po wewnętrznej stronie instrukcji sprzężenia zewnętrznego. W tym celu uruchom następujące instrukcje Transact-SQL w oknie zapytania:

    SELECT tleft.c1   
    FROM tleft   
    RIGHT JOIN tright   
    ON tleft.c1 = tright.c1   
    WHERE tright.c1 <> 2 ;
    

    Zwróć uwagę na następujące dane wyjściowe w okienku wyników:

    c1  
    ---
    NULL  
    NULL  
    

Po uruchomieniu zapytania SELECT w celu uzyskania dostępu do tabel w trybie przeglądania zestaw wyników zapytania SELECT zawiera dwie wartości NULL kolumny c1 w tabeli tleft ze względu na definicję prawej instrukcji sprzężenia zewnętrznego. W związku z tym w zestawie wyników nie można odróżnić wartości NULL, które pochodzą z tabeli i wartości NULL wprowadzone przez prawą instrukcję sprzężenia zewnętrznego. Jeśli musisz zignorować wartości NULL z zestawu wyników, mogą zostać wyświetlone nieprawidłowe wyniki.

Nuta

Jeśli kolumny uwzględnione w indeksie unikatowym nie akceptują NULL wartości, wszystkie wartości NULL w zestawie wyników zostały wprowadzone przez prawą instrukcję sprzężenia zewnętrznego.

FOR XML

XML

Określa, że wyniki zapytania mają być zwracane jako dokument XML. Należy określić jeden z następujących trybów XML: RAW, AUTO, EXPLICIT. Aby uzyskać więcej informacji na temat danych XML i programu SQL Server, zobacz FOR XML (SQL Server).

RAW [ ('ElementName') ]

Pobiera wynik zapytania i przekształca każdy wiersz w zestawie wyników w element XML z identyfikatorem ogólnym <row /> jako tag elementu. Opcjonalnie możesz określić nazwę elementu wiersza. Wynikowe dane wyjściowe XML używają określonego ElementName jako elementu wiersza wygenerowanego dla każdego wiersza. Aby uzyskać więcej informacji, zobacz Use RAW Mode with FOR XML.

AUTOMATYCZNIE

Zwraca wyniki zapytania w prostym, zagnieżdżonym drzewie XML. Każda tabela w klauzuli FROM, dla której co najmniej jedna kolumna jest wymieniona w klauzuli SELECT, jest reprezentowana jako element XML. Kolumny wymienione w klauzuli SELECT są mapowane na odpowiednie atrybuty elementu. Aby uzyskać więcej informacji, zobacz Use AUTO Mode with FOR XML.

WYRAŹNY

Określa, że kształt wynikowego drzewa XML jest zdefiniowany jawnie. Korzystając z tego trybu, zapytania muszą być zapisywane w określony sposób, aby dodatkowe informacje o żądanym zagnieżdżeniu zostały określone jawnie. Aby uzyskać więcej informacji, zobacz Use EXPLICIT Mode with FOR XML.

XMLDATA

Zwraca wbudowany schemat XDR, ale nie dodaje elementu głównego do wyniku. Jeśli określono XMLDATA, schemat XDR jest dołączany do dokumentu.

Ważny

Dyrektywa XMLDATA jest przestarzała. Używaj generowania XSD w przypadku trybów RAW i AUTO. Brak zastąpienia dyrektywy XMLDATA w trybie EXPLICIT. Ta funkcja zostanie usunięta w przyszłej wersji programu SQL Server. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji.

Pomijanie niepożądanych podziałów wierszy: Możesz użyć programu SQL Server Management Studio (SSMS) do wystawienia zapytania korzystającego z klauzuli FOR XML. Czasami zwracana jest duża ilość kodu XML i wyświetlana w jednej komórce siatki. Ciąg XML może być dłuższy niż jedna komórka siatki programu SSMS może być przechowywana w jednym wierszu. W takich przypadkach program SSMS może wstawić znaki podziału wiersza między długimi segmentami całego ciągu XML. Takie podziały wierszy mogą wystąpić w środku podciągu, który nie powinien być podzielony między wiersze. Można zapobiec podziałom wierszy przy użyciu rzutu AS XMLDATA. To rozwiązanie może również mieć zastosowanie w przypadku używania FOR JSON PATH, jak w poniższej instrukcji Transact-SQL przykładowej SELECT:

SELECT CAST(
    (SELECT column1, column2
        FROM my_table
        FOR XML PATH('')
    )
        AS VARCHAR(MAX)
) AS XMLDATA ;

XMLSCHEMA [ ('TargetNameSpaceURI') ]

Zwraca wbudowany schemat XSD. Opcjonalnie można określić docelowy identyfikator URI przestrzeni nazw podczas określania tej dyrektywy, która zwraca określoną przestrzeń nazw w schemacie. Aby uzyskać więcej informacji, zobacz Generowanie wbudowanego schematu XSD.

PIERWIASTKI

Określa, że kolumny są zwracane jako podelementy. W przeciwnym razie są mapowane na atrybuty XML. Ta opcja jest obsługiwana tylko w trybach RAW, AUTO i PATH. Aby uzyskać więcej informacji, zobacz Use RAW Mode with FOR XML.

XSINIL

Określa, że element z atrybutem xsi:nil ustawionym na wartość True zostać utworzony dla wartości kolumn NULL. Tę opcję można określić tylko za pomocą dyrektywy ELEMENTS. Aby uzyskać więcej informacji, zobacz:

NIEOBECNY

Wskazuje, że dla wartości kolumn NULL odpowiednie elementy XML nie zostaną dodane w wyniku XML. Określ tę opcję tylko z elementami ELEMENTS.

PATH [ ('ElementName') ]

Generuje otokę elementów <row> dla każdego wiersza w zestawie wyników. Opcjonalnie możesz określić nazwę elementu dla otoki elementów <row>. Jeśli zostanie podany pusty ciąg, taki jak FOR XML PATH ('') ), element otoki nie zostanie wygenerowany. Użycie PATH może stanowić prostszą alternatywę dla zapytań napisanych przy użyciu dyrektywy EXPLICIT. Aby uzyskać więcej informacji, zobacz Use PATH Mode with FOR XML.

BINARNE BASE64

Określa, że zapytanie zwraca dane binarne w formacie binarnym zakodowanym w formacie base64. W przypadku pobierania danych binarnych przy użyciu trybu RAW i EXPLICIT należy określić tę opcję. Jest to ustawienie domyślne w trybie AUTO.

TYP

Określa, że zapytanie zwraca wyniki jako typ xml. Aby uzyskać więcej informacji, zobacz type dyrektywy w temacie FOR XML Queries.

ROOT [ ('RootName') ]

Określa, że do wynikowego kodu XML zostanie dodany pojedynczy element najwyższego poziomu. Opcjonalnie możesz określić nazwę elementu głównego do wygenerowania. Jeśli opcjonalna nazwa główna nie zostanie określona, zostanie dodany domyślny element <root>.

Aby uzyskać więcej informacji, zobacz FOR XML (SQL Server).

Przykład

Poniższy przykład określa FOR XML AUTO z opcjami TYPE i XMLSCHEMA. Ze względu na TYPE opcji zestaw wyników jest zwracany do klienta jako typ xml. Opcja XMLSCHEMA określa, że wbudowany schemat XSD jest uwzględniony w zwracanych danych XML, a opcja ELEMENTS określa, że wynik XML jest skoncentrowany na elementach.

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;  

DLA formatu JSON

Uwagi

W magazynie danych sieci szkieletowej FOR JSON musi być ostatnim operatorem w zapytaniu i dlatego nie jest dozwolony wewnątrz podzapytania.

JSON

Określ format JSON , aby zwrócić wyniki zapytania sformatowanego jako tekst JSON. Należy również określić jeden z następujących trybów JSON: AUTO lub PATH. Aby uzyskać więcej informacji na temat klauzuli FOR JSON, zobacz Format query results as JSON with FOR JSON (SQL Server).

AUTOMATYCZNIE

Sformatuj dane wyjściowe JSON automatycznie na podstawie struktury instrukcji SELECT, określając FOR JSON AUTO. Aby uzyskać więcej informacji i przykładów, zobacz Format danych wyjściowych JSON automatycznie przy użyciu trybu AUTOMATYCZNEGO (SQL Server).

ŚCIEŻKA

Uzyskaj pełną kontrolę nad formatem danych wyjściowych JSON, określając FOR JSON PATH. tryb PATH umożliwia tworzenie obiektów otoki i zagnieżdżanie złożonych właściwości. Aby uzyskać więcej informacji i przykładów, zobacz format zagnieżdżone dane wyjściowe JSON z trybem PATH (SQL Server).

INCLUDE_NULL_VALUES

Uwzględnij NULL wartości w danych wyjściowych JSON, określając opcję INCLUDE_NULL_VALUES z klauzulą FOR JSON. Jeśli nie określisz tej opcji, dane wyjściowe nie zawierają właściwości JSON dla wartości NULL w wynikach zapytania. Aby uzyskać więcej informacji i przykładów, zobacz Include Null Values in JSON Output with the INCLUDE_NULL_VALUES Option (SQL Server) (Uwzględnianie wartości null w danych wyjściowych JSON przy użyciu opcji INCLUDE_NULL_VALUES (SQL Server).

ROOT [ ('RootName') ]

Dodaj pojedynczy element najwyższego poziomu do danych wyjściowych JSON, określając opcję ROOT z klauzulą FOR JSON. Jeśli nie określisz opcji ROOT, dane wyjściowe JSON nie mają elementu głównego. Aby uzyskać więcej informacji i przykładów, zobacz Dodawanie węzła głównego do danych wyjściowych JSON przy użyciu opcji ROOT (SQL Server).

WITHOUT_ARRAY_WRAPPER

Usuń nawiasy kwadratowe otaczające dane wyjściowe JSON domyślnie, określając opcję WITHOUT_ARRAY_WRAPPER z klauzulą FOR JSON. Jeśli nie określisz tej opcji, dane wyjściowe JSON są ujęte w nawiasy kwadratowe. Użyj opcji WITHOUT_ARRAY_WRAPPER, aby wygenerować pojedynczy obiekt JSON jako dane wyjściowe. Aby uzyskać więcej informacji, zobacz Remove Square Brackets from JSON Output with the WITHOUT_ARRAY_WRAPPER Option (SQL Server) (Usuwanie nawiasów kwadratowych z danych wyjściowych JSON przy użyciu opcji WITHOUT_ARRAY_WRAPPER (SQL Server).

Aby uzyskać więcej informacji, zobacz Format query results as JSON with FOR JSON (SQL Server).