Udostępnij przez


SELECT — KLAUZULA FOR (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstancePunkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

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

  • Określ FOR BROWSE , aby zezwolić na aktualizacje podczas wyświetlania wyników zapytania w kursorze trybu przeglądania.
  • Określ FOR XML , aby sformatować wyniki zapytania jako XML.
  • Określ FOR JSON , aby sformatować wyniki zapytania w formacie JSON.

Transact-SQL konwencje składni

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

}

DO PRZEGLĄDANIA

BROWSE

Określa, że aktualizacje są dozwolone podczas wyświetlania danych w DB-Library kursor trybu przeglądania. Tabelę można przeglądać w aplikacji, jeśli tabela zawiera kolumnę znacznika czasu , tabela ma unikatowy indeks, a FOR BROWSE opcja znajduje się na końcu SELECT instrukcji wysyłanych do wystąpienia programu SQL Server.

Note

Nie można użyć instrukcji <lock_hint> HOLDLOCK w instrukcji SELECT zawierającej FOR BROWSE tę opcję.

FOR BROWSE Nie można wyświetlić w SELECT instrukcjach, które UNION operator łączy.

Note

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

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 FOR BROWSE. Po włączeniu opcji korzystania z trybu przeglądania FOR BROWSE tworzone są tabele tymczasowe.

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

    SET NO_BROWSETABLE ON;
    

    Po włączeniu NO_BROWSETABLE opcji wszystkie SELECT instrukcje zachowują się tak, jakby FOR BROWSE opcja została dołączona do instrukcji. Jednak opcja nie tworzy tabel tymczasowych, NO_BROWSETABLE których FOR BROWSE zazwyczaj używa opcja 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 SELECT zapytania, które obejmuje instrukcję OUTER JOIN , a gdy unikatowy indeks jest zdefiniowany w tabeli, która znajduje się po wewnętrznej stronie OUTER JOIN instrukcji, 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 SELECT zapytania, które obejmuje instrukcję OUTER JOIN .

  • Unikatowy indeks jest definiowany w tabeli, która znajduje się po wewnętrznej stronie instrukcji OUTER JOIN .

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. SampleDB W bazie danych utwórz tabelę i tabelę trighttleft 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 NULL wstawisz wartość tleft. 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);
    
  4. Włącz opcję NO_BROWSETABLE. W tym celu uruchom następujące instrukcje Transact-SQL w oknie zapytania:

    SET NO_BROWSETABLE ON;
    
  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 OUTER 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 SELECT zapytania w celu uzyskania dostępu do tabel w trybie przeglądania zestaw SELECT wyników zapytania zawiera dwie NULL wartości kolumny c1 w tleft tabeli ze względu na definicję RIGHT OUTER JOIN instrukcji. W związku z tym w zestawie wyników nie można odróżnić NULL wartości uzyskanych z tabeli i NULL wartości wprowadzonych przez instrukcję RIGHT OUTER JOIN . Jeśli zapytanie musi zignorować NULL wartości z zestawu wyników, może zostać wyświetlone nieprawidłowe wyniki.

Note

Jeśli kolumny uwzględnione w indeksie unikatowym nie akceptują NULL wartości, wszystkie NULL wartości w zestawie wyników zostały wprowadzone przez instrukcję RIGHT OUTER JOIN .

FOR XML (komenda SQL do formatowania wyników jako 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 (Używanie trybu RAW z językiem XML).

AUTO

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 (Używanie trybu AUTOMATYCZNEGO z językiem XML).

EXPLICIT

Określa, że kształt wynikowego drzewa XML jest zdefiniowany jawnie. Korzystając z tego trybu, należy napisać zapytania w określony sposób, aby jawnie określić dodatkowe informacje o żądanym zagnieżdżaniu. Aby uzyskać więcej informacji, zobacz Use EXPLICIT mode with FOR XML (Używanie trybu JAWNego z językiem XML).

XMLDATA

Zwraca wbudowany schemat XDR, ale nie dodaje elementu głównego do wyniku. Jeśli określisz XMLDATAwartość , schemat XDR zostanie dołączony do dokumentu.

Important

Dyrektywa XMLDATA jest przestarzała. Użyj generowania XSD dla RAW trybów i AUTO . Nie ma zamiany XMLDATA dyrektywy w EXPLICIT trybie. 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 uruchomienia 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.

ELEMENTS

Określa, że kolumny są zwracane jako podelementy. W przeciwnym razie zapytanie mapuje je na atrybuty XML. Ta opcja jest obsługiwana tylko w RAWtrybach , AUTOi PATH . Aby uzyskać więcej informacji, zobacz Use RAW mode with FOR XML (Używanie trybu RAW z językiem XML).

XSINIL

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

ABSENT

Wskazuje, że dla NULL wartości kolumn odpowiednie elementy XML nie są dodawane w wyniku XML. Określ tę opcję tylko za pomocą ELEMENTSpolecenia .

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 podasz 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 (Używanie trybu PATH z językiem XML).

BINARNE BASE64

Określa, że zapytanie zwraca dane binarne w formacie binarnym zakodowanym w formacie base64. Podczas pobierania danych binarnych przy użyciu funkcji RAW i EXPLICIT trybu należy określić tę opcję. Ta opcja jest domyślna w AUTO trybie.

TYPE

Określa, że zapytanie zwraca wyniki jako typ xml. Aby uzyskać więcej informacji, zobacz dyrektywa TYPE w zapytaniach XML.

ROOT [ ('RootName') ]

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

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

Example

Poniższy przykład określa FOR XML AUTO z opcjami TYPE i XMLSCHEMA. Ze względu na TYPE opcję zapytanie zwraca zestaw wyników klientowi 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 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;

DLA JSON

Remarks

W magazynie danych sieci szkieletowej zapytanie musi kończyć się ciągiem FOR JSON, aby nie można było go używać wewnątrz podzapytania.

JSON

Określ FOR 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 klauzuliFOR JSON, zobacz Format query results as JSON with FOR JSON (Formatowanie wyników zapytania w formacie JSON przy użyciu formatu JSON).

AUTO

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 Automatyczne formatowanie danych wyjściowych JSON za pomocą trybu AUTOMATYCZNEGO.

PATH

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 Formatowanie zagnieżdżonych danych wyjściowych JSON przy użyciu trybu PATH.

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 NULL wartości w wynikach zapytania. Aby uzyskać więcej informacji i przykładów, zobacz Include Null Values in JSON - INCLUDE_NULL_VALUES Option (Uwzględnij wartości null w formacie JSON — opcja INCLUDE_NULL_VALUES).

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.

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 Usuń nawiasy kwadratowe z formatu JSON — opcja WITHOUT_ARRAY_WRAPPER.

Aby uzyskać więcej informacji, zobacz Format query results as JSON with FOR JSON (Formatowanie wyników zapytania w formacie JSON przy użyciu formatu JSON).