共用方式為


xml 資料類型的 FOR XML 支援

如果 FOR XML 查詢在 SELECT 子句中指定 xml 類型的資料行,無論您是否指定 ELEMENTS 指示詞,資料行值都會對應為傳回的 XML 中之元素。xml 類型資料行中的任何 XML 宣告都沒有序列化。

例如,下列查詢會從 xml 類型的 AdditionalContactInfo 資料行擷取客戶連絡資訊,例如 ContactID、FirstName 和 LastName 資料行,以及電話號碼。

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

因為查詢並未指定 ELEMENTS 指示詞,除了從 xml 類型資料行擷取的其他連絡資訊值以外,資料行值都是以屬性傳回。這些是以元素傳回。

以下是部份結果:

<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>
...

如果您為 XQuery 產生的 XML 資料行指定資料行別名,該別名會用來在 XQuery 產生的 XML 周圍加入包裝函式元素。例如,下列查詢指定 MorePhoneNumbers 做為資料行別名:

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

XQuery 傳回的 XML 會包在 <MorePhoneNumbers> 元素內,如以下的部份結果所示:

<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>
...

如果您在查詢中指定 ELEMENTS 指示詞,則產生的 XML 中會將 ContactID、LastName 和 FirstName 以元素傳回。

下列範例說明 FOR XML 處理邏輯並不會從 xml 類型資料行,序列化 XML 資料中的任何 XML 宣告:

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

以下是結果。在結果中,XML 宣告 <?xml version="1.0" encoding="UTF-8" ?> 沒有序列化。

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

從使用者自訂函數傳回 XML

可利用 FOR XML 查詢,從傳回下列項目之一的使用者自訂函數,傳回 XML:

  • 具有單一 xml 類型資料行的資料表
  • xml 類型的執行個體

例如,下列使用者自訂函數會傳回具有單一 xml 類型資料行的資料表:

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

您可以執行使用者自訂函數,並查詢它所傳回的資料表。在此範例中,會將透過查詢資料表而傳回的 XML 指派給 xml 類型的變數。

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

以下是另一個使用者自訂函數範例。這個使用者自訂函數會傳回 xml 類型的執行個體。在此範例中,使用者自訂函數會傳回 XML 類型的執行個體,因為有指定結構描述命名空間。

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

使用者自訂函數傳回的 XML 可以指派到 xml 類型的變數,如下所示:

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

請參閱

參考

各個 SQL Server 資料類型的 FOR XML 支援

說明及資訊

取得 SQL Server 2005 協助