SELECT — FOR, klauzula (Transact-SQL)
Dotyczy:SQL Server
Azure SQL Database
punkt końcowy analizy SQL usługi Azure SQL
SQL w usłudze Microsoft Fabric
Warehouse w usłudze Microsoft Fabric
SQL 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:
W programie SQL Server Management Studio utwórz bazę danych o nazwie
SampleDB
.W bazie danych
SampleDB
utwórz tabelętleft
i tabelętright
zawierającą jedną kolumnę o nazwiec1
. Zdefiniuj unikatowy indeks w kolumniec1
w tabelitleft
i ustaw kolumnę tak, aby akceptowałaNULL
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
Wstaw kilka wartości w tabeli
tleft
i tabelitright
. Upewnij się, że w tabelitleft
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
Włącz opcję
NO_BROWSETABLE
. W tym celu uruchom następujące instrukcje Transact-SQL w oknie zapytania:SET NO_BROWSETABLE ON ; GO
Uzyskaj dostęp do danych w tabeli
tleft
i tabelitright
przy użyciu instrukcji sprzężenia zewnętrznego w zapytaniuSELECT
. Upewnij się, że tabelatleft
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).