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 支援