Sdílet prostřednictvím


Direktiva TYPE v dotazech FOR XML

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Podpora SQL Serveru pro xml (Transact-SQL) datového typu umožňuje volitelně požádat o vrácení výsledku dotazu FOR XML jako xml zadáním direktivy TYPE. To vám umožní zpracovat výsledek dotazu FOR XML na serveru. Například můžete zadat XQuery pro daný objekt, přiřadit výsledek proměnné typu xml, nebo napsat vnořené dotazy FOR XML.

Poznámka

SQL Server vrátí klientovi datové instance typu XML jako výsledek různých serverových konstrukcí, jako jsou dotazy FOR XML, které používají direktivu TYPE, nebo kde se datový typ XML používá k vrácení hodnot dat instance XML ze sloupců tabulky SQL a výstupních parametrů. V kódu klientské aplikace poskytovatel ADO.NET požaduje tento xml informace datového typu, které mají být odeslány v binárním kódování ze serveru. Pokud však používáte FOR XML bez direktivy TYPE, data XML se vrátí jako textový řetězec. V každém případě bude zprostředkovatel klienta vždy schopen zpracovat jakoukoli formu XML. Všimněte si, že nejvyšší úroveň FOR XML bez direktivy TYPE nelze použít s kurzory.

Příklady

Následující příklady ilustrují použití direktivy TYPE s dotazy FOR XML.

Načítání výsledků dotazu FOR XML jako typu xml

Následující dotaz načte kontaktní údaje zákazníka z tabulky Contacts. Vzhledem k tomu, že směrnice TYPE je zadaná v FOR XML, výsledek je vrácen jako typ XML.

USE AdventureWorks2022;
Go
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
ORDER BY BusinessEntityID
FOR XML AUTO, TYPE;

Toto je částečný výsledek:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez"/>
<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>
...

Přiřazení výsledků dotazu FOR XML proměnné typu XML

V následujícím příkladu je výsledek FOR XML přiřazen k proměnné typu xml@x. Dotaz načte kontaktní informace, například BusinessEntityID, FirstName, LastNamea další telefonní čísla, ze sloupce AdditionalContactInfoxmlTYPE. Protože klauzule FOR XML určuje direktivu TYPE, vrátí se XML jako xml typ a je přiřazen k proměnné.

USE AdventureWorks2022;
GO
DECLARE @x xml;
SET @x = (
   SELECT BusinessEntityID,
          FirstName,
          LastName,
          AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
              //act:telephoneNumber/act:number') as MorePhoneNumbers
   FROM Person.Person
   FOR XML AUTO, TYPE);
SELECT @x;
GO

Získání výsledků dotazu FOR XML

Dotazy FOR XML vrací XML. Proto můžete použít metody xml type, jako jsou query() a value(), na výsledek XML vrácený dotazy FOR XML.

V následujícím dotazu se metoda query() datového typu xml používá k vyhledávání výsledku dotazu FOR XML. Další informace naleznete v tématu query() metoda (xml datový typ).

USE AdventureWorks2022;
GO
SELECT (SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
DECLARE namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
DECLARE namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumbers
FROM Person.Person
FOR XML AUTO, TYPE).query('/Person.Person[1]');

Vnitřní SELECT ... FOR XML dotaz vrátí výsledek xml, na který vnější SELECT použije query() metodu xml. Poznamenejte si zadanou direktivu TYPE.

Toto je výsledek:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez">
  <PhoneNumbers>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">111-111-1111</act:number>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">112-111-1111</act:number>
  </PhoneNumbers>
</Person.Person>

V následujícím dotazu se metoda value() datového typu xml používá k načtení hodnoty z výsledku XML vráceného dotazem SELECT...FOR XML. Další informace naleznete v tématu value() Metoda (xml datový typ).

USE AdventureWorks2022;
GO
DECLARE @FirstPhoneFromAdditionalContactInfo varchar(40);
SELECT @FirstPhoneFromAdditionalContactInfo =
( SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
   //act:telephoneNumber/act:number
   ') AS PhoneNumbers
   FROM Person.Person Contact
   FOR XML AUTO, TYPE).value('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
  /Contact[@BusinessEntityID="1"][1]/PhoneNumbers[1]/act:number[1]', 'varchar(40)'
);
SELECT @FirstPhoneFromAdditionalContactInfo;

Výraz cesty XQuery v metodě value() načte první telefonní číslo kontaktu zákazníka, jehož BusinessEntityID je 1.

Poznámka

Pokud není zadána direktiva TYPE, vrátí se výsledek dotazu FOR XML jako typ nvarchar(max).

Použití výsledků dotazu FOR XML ve funkci INSERT, UPDATE a DELETE (Transact-SQL DML)

Následující příklad ukazuje, jak lze dotazy FOR XML použít v příkazech jazyka DML (Data Manipulation Language). V příkladu vrátí FOR XML instanci typu xml. Příkaz INSERT vloží tento KÓD XML do tabulky.

CREATE TABLE T1(intCol int, XmlCol xml);
GO
INSERT INTO T1
VALUES(1, '<Root><ProductDescription ProductModelID="1" /></Root>');
GO

CREATE TABLE T2(XmlCol xml)
GO
INSERT INTO T2(XmlCol)
SELECT (SELECT XmlCol.query('/Root')
        FROM T1
        FOR XML AUTO,TYPE);
GO

Viz také