FOR XML 查詢中的 TYPE 指示詞
在 SQL Server 2000 中,FOR XML 查詢的結果永遠會以文字形式直接傳回用戶端。隨著 SQL Server 2005 對於 xml 資料類型的支援,您可以指定 TYPE 指定詞,以選擇性地要求以 xml 資料類型傳回 FOR XML 查詢的結果。這將允許您處理伺服器上 FOR XML 查詢的結果。例如,您可以針對它指定 XQuery、將結果指派至 xml 類型變數或撰寫巢狀 FOR XML 查詢。
附註: |
---|
SQL Server 會傳回 XML 資料類型的執行個體資料至用戶端,做為不同伺服器建構的結果,例如使用 TYPE 指示詞的 FOR XML 查詢,或使用 xml 資料類型從 SQL 資料表資料行和輸出參數傳回 XML 執行個體資料。在用戶端應用程式中,ADO.NET 提供者要求以二進位編碼從伺服器傳送此 XML 資料類型資訊。然而,如果您使用沒有 TYPE 指示詞的 FOR XML,XML 資料會以字串類型傳回。在任一情況下,用戶端提供者將永遠可以處理任一 XML 形式。 |
範例
下列範例說明 FOM XML 查詢的用途。
A. 擷取 FOR XML 查詢結果做為 xml 類型
下列查詢將擷取 Contacts 資料表中客戶的連絡資訊。由於 TYPE 指示詞是指定在 FOR XML 中,因此結果會以 xml 類型傳回。
SELECT ContactID, FirstName, LastName, Phone
FROM Person.Contact
ORDER BY ContactID
FOR XML AUTO, TYPE
以下是部份結果:
<Contact ContactID="1" FirstName="Syed" LastName="Abbas"
Phone="398-555-0132"/>
<Contact ContactID="2" FirstName="Catherine" LastName="Abel"
Phone="747-555-0171"/>
...
B. 指派 FOR XML 查詢結果做為 xml 類型變數
在下列範例中,FOR XML 結果已指派為 xml 類型變數 @x。查詢會從 xml 類型的 AdditionalContactInfo 資料行擷取連絡資訊,例如 ContactID、FirstName、LastName 以及其他的電話號碼。由於 FOR XML 子句會指定 TYPE 指示詞,因此 XML 將以 xml 類型傳回並將其指派給變數。
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
C. 查詢 FOR XML 查詢的結果
FOR XML 查詢會傳回 XML。因此您可以將 xml 類型方法 (例如 query() 與 value()) 套用至 FOR XML 查詢所傳回的 XML 結果。
在下列查詢中,xml 資料類型的 query() 方法是用以查詢 FOR XML 查詢的結果。如需詳細資訊,請參閱<query() 方法 (xml 資料類型)>)。
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]')
內部 SELECT … FOR XML 查詢會傳回 xml 類型結果,以利外部 SELECT 將 query() 方法套用至 xml 類型。請注意已指定 TYPE 指示詞。
以下是結果:
<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>
在下列查詢中,xml 資料類型的 value() 方法是用以擷取 SELECT…FOR XML 查詢所傳回的 XML 結果。如需詳細資訊,請參閱<value() 方法 (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
在 value() 方法中的 XQuery 路徑運算式會擷取客戶連絡人之 ContactID 為 1 的第一個客戶電話號碼。
附註: |
---|
由於未指定 TYPE 指示詞,因此 FOR XML 查詢結果會以 nvarchar(max) 類型傳回。 |
D. 使用 INSERT、UPDATE 以及 DELETE (Transact-SQL DML) 中的 FOR XML 查詢結果 (Transact-SQL DML)
下列範例示範如何在「資料管理語言」(DML) 陳述式中使用 FOR XML 查詢。在下列範例中,FOR XML 會傳回 xml 類型的執行個體。INSERT 陳述式會將此 XML 插入資料表中。
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