PATH 模式透過別名路徑決定輸出結構:
@AttributeName → 屬性ElementName → 子元素Parent/Child → 巢狀階層SELECT
ProductID AS '@ProductID',
Name AS 'Name',
Color AS 'Specs/Color',
Size AS 'Specs/Size'
FROM Production.Product
FOR XML PATH('Product'), ROOT('Catalog');
輸出:
<Catalog>
<Product ProductID="1">
<Name>Widget</Name>
<Specs>
<Color>Red</Color>
<Size>M</Size>
</Specs>
</Product>
</Catalog>
DECLARE @x XML = N'- A
';
SELECT @x.query('/Root/Item/@id'); -- XQuery 查詢
-- 1. 建立 Schema 集合
CREATE XML SCHEMA COLLECTION OrderSchema AS
N'
';
-- 2. 建立綁定 Schema 的表
CREATE TABLE Orders(
OrderID INT PRIMARY KEY,
OrderData XML(OrderSchema) -- 類型化 XML 欄位
);
-- 3. 插入驗證
INSERT INTO Orders VALUES (1, N'Acme 99.99 '); -- 成功
INSERT INTO Orders VALUES (2, N'Beta '); -- 失敗:缺 Total
-- 主 XML 索引
CREATE PRIMARY XML INDEX PXML_Orders_OrderData ON Orders(OrderData);
-- 次要索引:PATH、VALUE、PROPERTY
CREATE XML INDEX IX_Orders_Path ON Orders(OrderData) USING XML INDEX PXML_Orders_OrderData FOR PATH;
CREATE XML INDEX IX_Orders_Value ON Orders(OrderData) USING XML INDEX PXML_Orders_OrderData FOR VALUE;
主索引將 XML 解析為關聯式資料列集(節點表),次要索引針對路徑、值、屬性建立 B-tree,大幅提升 .exist()、.value()、.query() 效能。
FOR XML PATH 產生可控結構,避免 AUTO 模式的不可預測性。FILESTREAM 或拆分儲存,避免單一欄位過大影響緩衝池。