2012-01-10 28 views
3

以下是我正在做的事情。我將XML文件插入XML列,與其他欄目如日期戳記等進行記錄沿(這些都是無關緊要的這一請求)使用SQL Server將XML文件分解爲單獨的行

的文件看起來像類似於這樣:

<topLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 
<topLevelItem> 

我的目標是能夠查詢XML字段並獲取每個<secondLevelItem>在它自己的行中的結果集,以XML格式顯示。如下面:

行1:

<secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 

行2:

<secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 

行3:

<secondLevelItem> 
    <secondLevelItemDetail> 
    </secondLevelItemDetail> 
    <secondLevelItemAnotherDetail> 
    </secondLevelItemAnotherDetail> 
    </secondLevelItem> 

這給使用Microsoft SQL Server來完成,而無需使用CLI。我需要能夠聲明哪個XML節點是我想要分解的,因爲有些文件具有我不需要的其他XML元素。所以像WHERE node = secondLevelItem

回答

2

使用SQL Server 2005及更新版本,SQL Server中有出色的XQuery支持。

這種方法在這裏將要使用的.nodes().query()方法:

SELECT 
    Col.query('.') 
FROM 
dbo.YourTable 
CROSS APPLY 
    YourXmlColumn.nodes('/topLevelItem/secondLevelItem') AS Tbl(Col) 
WHERE 
    (some condition) 

.nodes()函數創建一個「暫時的,內聯」僞代碼表Tbl與單個列Col其包含用於在每個節點一個XML條目您的XML列與匹配的XPath匹配(在這種情況下:<topLevelItem>中的每個<secondLevelItem>都將匹配)。

由於您希望爲每個XML元素使用整個XML,只需使用.query('.')即可返回完整的XML元素。

1

使用nodes()來碎化您的XML並使用local-name()sql:variable()找到您想要的節點,然後使用query()檢索XML。

declare @NodeName varchar(100) = 'secondLevelItem' 

select T.N.query('.') 
from YourTable 
    cross apply XMLCol.nodes('//*[local-name()=sql:variable("@NodeName")]') as T(N) 
1

如果您只是將原始XML提供給存儲過程而不從表中提取,則可以執行以下操作。

DECLARE @XML xml 
SET @XML = '<topLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail>One</secondLevelItemDetail> 
    <secondLevelItemAnotherDetail>One One</secondLevelItemAnotherDetail> 
    </secondLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail>Two</secondLevelItemDetail> 
    <secondLevelItemAnotherDetail>Two Two</secondLevelItemAnotherDetail> 
    </secondLevelItem> 
    <secondLevelItem> 
    <secondLevelItemDetail>Three</secondLevelItemDetail> 
    <secondLevelItemAnotherDetail>Three Three</secondLevelItemAnotherDetail> 
    </secondLevelItem> 
</topLevelItem>' 


SELECT 
    Tbl.Col.query('.') 
FROM 
    @XML.nodes('/topLevelItem/secondLevelItem') AS Tbl(Col)