TYPE Directive in FOR XML Queries

W SQL Server 2000, wynikiem kwerendy FOR XML jest zawsze bezpośrednio zwracaną do klient w postaci tekstowej. Zaczyna się od SQL Server 2005, SQL Server Obsługa Typ danych XML umożliwia opcjonalnie wniosek, że wynikiem kwerendy FOR XML zwracane jako XML typ danych przez określenie dyrektywa TYPE.Dzięki temu można do przetworzenia wyników FOR XML kwerendy na serwerze.Na przykład określić XQuery przed nim, wynik, aby przypisać XML wpisz zmienną lub napisać Kwerendy nested FOR XML.

Uwaga

SQL Server Zwraca dane XML wpisz wystąpienie danych do klient z innym serwerem konstrukcje, takich jak XML dla kwerendy, należy użyć dyrektywy typ lub gdy xml Typ danych jest używany do zwracają XML wystąpienie danych wartości z kolumn tabel SQL i parametry wyjściowe. W kodzie aplikacji klient dostawca ADO.NET żądania tego typu danych XML na wysłanie w binarnym kodowanie z serwera.Niemniej jednak jeśli używasz FOR XML bez dyrektywa typ danych XML wróci jako typu ciąg.W każdym przypadek zawsze będzie mógł obsługiwać obu formularzy XML dostawca klient.Należy zauważyć, że najwyższego poziom FOR XML bez dyrektywa typ nie może być używany z kursorów.

Przykłady

Poniższe przykłady ilustrują użycie dyrektywy TYPE FOR XML kwerendy.

Wyniki kwerendy pobieranie FOR XML jako typ danych xml

Następująca kwerenda pobiera informacje kontaktowe klienta z tabela Kontakty.Ponieważ dyrektywa typ został określony w formacie XML FOR, wyniki są zwracane jako XML typu.

SELECT ContactID, FirstName, LastName, Phone
FROM Person.Contact
ORDER BY ContactID
FOR XML AUTO, TYPE

Jest to wynik częściowy:

<Contact ContactID="1" FirstName="Syed" LastName="Abbas" 
         Phone="398-555-0132"/>
<Contact ContactID="2" FirstName="Catherine" LastName="Abel" 
         Phone="747-555-0171"/>
...

Wyniki kwerendy Assigning FOR XML do zmiennej typu danych xml

W poniższym przykładzie wynik FOR XML jest przypisany do XML typ zmiennej, @ x.Informacje kontaktowe, takie jak ContactID, imię, nazwisko i numery telefonów dodatkowe, pobieranych przez kwerendę z kolumna AdditionalContactInfo XML TYP.Ponieważ klauzulę FOR XML określa typ dyrektywa XML są zwracane jako XML typu i jest przypisany do zmiennej.

DECLARE @x XML
SET @x = (
   SELECT ContactID, 
          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.Contact
   FOR XML AUTO, TYPE)
SELECT @x
GO

Podczas badania wyniki kwerendy FOR XML

Kwerendy FOR XML zwracają XML.Z tego powodu można zastosować XML typu metody, takie jak Query() and Value(), zwracane przez kwerendy FOR XML wyniku XML.

W następującej kwerendzie Query() Metoda XML typ danych jest wykorzystywane do badania wynikiem kwerendy FOR XML.Aby uzyskać więcej informacji zobaczquery() Method (xml Data Type).

SELECT (SELECT ContactID, 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.Contact
FOR XML AUTO, TYPE).query('/Person.Contact[1]')

Zwraca wewnętrzny kwerendy SELECT … FOR XML XML typu wyniku której SELECT zewnętrzne dotyczy Query() Metoda XML typu.Należy zwrócić uwagę, dyrektywa typ określony.

Oto wynik:

<Person.Contact ContactID="1" FirstName="Gustavo" LastName="Achong">
  <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.Contact>

W następującej kwerendzie Value() Metoda XML typ danych jest używany do pobierania wartości z wynikiem XML zwróconych przez kwerendę SELECT…FOR XML.Aby uzyskać więcej informacji zobaczValue() metoda (typ danych xml).

declare @FirstPhoneFromAdditionalContactInfo varchar(40);
SELECT @FirstPhoneFromAdditionalContactInfo = 
 ( SELECT ContactID, 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.Contact Contact
   FOR XML AUTO, TYPE).value('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
  /Contact[@ContactID="1"][1]/PhoneNumbers[1]/act:number[1]', 'varchar(40)'
 )
select @FirstPhoneFromAdditionalContactInfo

Wyrażenie ścieżka XQuery w Value() metoda pobiera pierwszy numer telefonu kontaktu nabywcy, którego ContactID wynosi 1.

Uwaga

Jeżeli nie określono typu w dyrektywie, wynik kwerendy FOR XML jest zwracany jako typ nvarchar(max).

Wyniki kwerendy przy użyciu FOR XML w INSERT, UPDATE i DELETE (DML języka Transact-SQL)

Poniższy przykład ilustruje sposób użycia kwerendy FOR XML w instrukcjach język edycji danych (DML).W przykładzie kodu XML dla zwraca wystąpienie XML typu.Instrukcja INSERT wstawia ten XML do tabela.

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

See Also

Reference