Udostępnij przez


OBSŁUGĘ XML typu danych xml

Jeśli kwerenda XML dla określa kolumna xml typu w klauzula SELECT wartości kolumna są mapowane jako elementy XML zwróconych, niezależnie od tego, czy wybrano dyrektywy elementów.Wszelkich deklaracja XML w xml kolumna Typ nie jest seryjny.

Na przykład, poniższa kwerenda pobiera informacji kontaktowych klientów takich jak BusinessEntityID, FirstName, i LastName kolumna i numery telefonów z AdditionalContactInfo kolumna xml typu.

USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID, 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.Person
WHERE AdditionalContactInfo.query('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
 //act:telephoneNumber/act:number
')IS NOT NULL
FOR XML AUTO, TYPE;

Ponieważ kwerenda nie określa dyrektywa elementów, wartości kolumn są zwracane jako atrybuty, z wyjątkiem wartości dodatkowych informacji kontaktowych pobierane z xml typu kolumna.Są one zwracane jako elementy.

Jest to wynik częściowy:

<Person.Person BusinessEntityID="291" FirstName="Gustavo" LastName="Achong">

<PhoneNumber>

<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1112</act:number>

<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1111</act:number>

</PhoneNumber>

</Person.Person>

<Person.Person BusinessEntityID="293" FirstName="Catherine" LastName="Abel">

<PhoneNumber>

<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-2222</act:number>

<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-1234</act:number>

</PhoneNumber>

</Person.Person>
...

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

SELECT BusinessEntityID, 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.Person
WHERE AdditionalContactInfo.query('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
 //act:telephoneNumber/act:number
')IS NOT NULL
FOR XML AUTO, TYPE;

XML zwróconych przez XQuery zapakowane jest w <MorePhoneNumbers> element, jak pokazano na następujący wynik częściowy:

<Person.Person BusinessEntityID="291" FirstName="Gustavo" LastName="Achong">

<MorePhoneNumbers>

<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1112</act:number>

<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1111</act:number>

</MorePhoneNumbers>

</Person.Person>

<Person.Person BusinessEntityID="293" FirstName="Catherine" LastName="Abel">

<MorePhoneNumbers>

<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-2222</act:number>

<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-1234</act:number>

</MorePhoneNumbers>

</Person.Person>
...

Jeśli określisz dyrektywy elementów w kwerendzie, BusinessEntityID, nazwisko i imię będą zwracane jako elementy XML wynikowe.

Poniższy przykład ilustruje logiki przetwarzania XML dla nie serializować wszelkich deklaracji XML w danych XML z xml kolumna Typ:

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 wynikiem.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 funkcji zdefiniowanej przez użytkownika

XML można kwerend przekazujących dane XML ze zdefiniowanej przez użytkownika funkcja zwraca jedną z następujących czynności:

  • Tabela z jednym xml Typ kolumna

  • Wystąpienie xml typu

Na przykład, poniższa funkcja zdefiniowana przez użytkownika zwraca tabela z pojedynczej kolumna xmtypu l:

USE AdventureWorks2008R2;
GO
CREATE FUNCTION dbo.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 tabela zwrócone przez kwerendę.W tym przykładzie zwracane przez kwerendy tabela 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 zdefiniowana przez użytkownika zwraca pismo XML wystąpienie, ponieważ określony obszar nazw schematu.

DROP FUNCTION dbo.MyUDF;
GO
CREATE FUNCTION MyUDF (@ProductModelID int) 
RETURNS xml ([Production].[ProductDescriptionSchemaCollection])
AS
BEGIN
  declare @x xml
  set @x =   ( SELECT CatalogDescription
          FROM Production.ProductModel
          WHERE ProductModelID = @ProductModelID )
  return @x
END;

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;