Udostępnij przez


FOR XML Support for the xml Data Type

Jeśli FOR XML kwerendy określa kolumna XML typu w klauzula SELECT wartości kolumna są mapowane jako elementy XML zwrócone, niezależnie od tego, czy należy określić w dyrektywie elementów.Wszelkie deklaracja XML w XML typu kolumna nie jest seryjny.

Na przykład, poniższa kwerenda pobiera odbiorcy informacje kontaktowe, takie jak kolumna ContactID, imię i nazwisko oraz numery telefonów z AdditionalContactInfo kolumnaXML typu.

SELECT ContactID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
 //act:telephoneNumber/act:number
') AS PhoneNumber
FROM Person.Contact
FOR XML AUTO, TYPE

Ponieważ kwerenda nie określa dyrektywę elementów, wartości kolumn są zwracane w postaci atrybutów, z wyjątkiem wartości dodatkowych informacji kontaktowych pobierane z XML typu kolumna.Są one zwracane jako elementy.

Jest to wynik częściowy:

<Contact ContactID="1" FirstName="Syed" LastName="Abbas">
    <act:number xmlns:act=
       "http://schemas.adventure-works.com/AdditionalContactTypes">
          111-111-1111</act:number>
    <act:number xmlns:act=
       "http://schemas.adventure-works.com/AdditionalContactTypes">
         112-111-1111</act:number>
</Contact>
<Contact ContactID="2" FirstName="Catherine" LastName="Abel">
    ...
</Contact>
...

Jeśli zostanie określony alias kolumna dla kolumna XML wygenerowany przez XQuery, które alias służy do dodawania element otoki wokół XML wygenerowany przez XQuery.Na przykład poniższa kwerenda określa MorePhoneNumbers jako alias kolumna:

SELECT ContactID, FirstName, LastName, AdditionalContactInfo.query('
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

Kod XML zwrócone przez XQuery jest otoczona <MorePhoneNumbers> element, jak pokazano na następujące wyniki częściowe:

<Contact ContactID="1" FirstName="Syed" LastName="Abbas">
  <MorePhoneNumbers>
    <act:number xmlns:act="http://schemas.adventure-works.com/AdditionalContactTypes">111-111-1111</act:number>
    <act:number xmlns:act="http://schemas.adventure-works.com/AdditionalContactTypes">112-111-1111</act:number>
  </MorePhoneNumbers>
</Contact>
<Contact ContactID="2" FirstName="Catherine" LastName="Abel">
  <MorePhoneNumbers>
        ...
  </MorePhoneNumbers>
</Contact>
...

Jeśli określisz dyrektywa elementów w kwerendzie zostaną zwrócone ContactID, nazwisko i imię, jako elementy w wynikowym pliku XML.

Poniższy przykład pokazuje, że logiki przetwarzania FOR XML nie serializować wszelkich deklaracji XML w danych XML z XML typ kolumna:

create table t(i int, x xml)
go
insert into t values(1, '<?xml version="1.0" encoding="UTF-8" ?>
                             <Root SomeID="10" />')
select i, x
from   t
for xml auto

Jest to wynik.W wyniku deklaracja XML <?xml version="1.0" encoding="UTF-8" ?> nie jest seryjny.

<root>
  <t i="1">
    <x>
      <Root SomeID="10" />
    </x>
  </t>
</root>

Zwracanie XML z funkcja zdefiniowanych przez użytkownika

DO XML kwerendy mogą służyć do zwracania XML z funkcja zdefiniowanej przez użytkownika, która zwraca jedną z następujących czynności:

  • Tabela z jednym XML Kolumna typu

  • Wystąpienie XML type

Na przykład poniższa funkcja zdefiniowana przez użytkownika zwraca tabela z pojedynczej kolumna XML type:

CREATE FUNCTION MyUDF (@ProudctModelID int)
RETURNS @T TABLE
  (
     ProductDescription xml
  )
AS
BEGIN
  INSERT @T
     SELECT CatalogDescription.query('
declare namespace PD="https://www.adventure-works.com/schemas/products/description";
                    //PD:ProductDescription  ')
     FROM Production.ProductModel
     WHERE ProductModelID = @ProudctModelID
  RETURN
END

Można wykonać funkcja zdefiniowanej przez użytkownika i kwerendy tabela zwrócone przez nią.W tym przykładzie zwracane przez kwerendy w tabela Kod XML jest przypisany do XML typu zmiennej.

declare @x xml
set @x = (SELECT * FROM MyUDF(19))
select @x

Jest to inny przykład funkcja zdefiniowanej przez użytkownika.Ta funkcja zdefiniowana przez użytkownika zwraca wystąpienie XML typu.W tym przykładzie funkcja zdefiniowanej przez użytkownika zwraca wpisywanych wystąpienie XML, ponieważ obszar nazw schematu jest określona.

drop function MyUDF4
go
CREATE FUNCTION MyUDF4 (@ProductModelID int) 
RETURNS xml ([Production].[ProductDescriptionSchemaCollection])
AS
BEGIN
  declare @x xml
  set @x =   ( SELECT CatalogDescription
          FROM Production.ProductModel
          WHERE ProductModelID = @ProductModelID )
  return @x
END

Kod XML zwróconych przez funkcja zdefiniowaną przez użytkownika można przypisać do XML wpisz zmienną w następujący sposób:

declare @x xml
SELECT @x= dbo.MyUDF4 (19) 
select @x