2010-10-27 85 views
2

我在使用XML在sql server中有些新意,並且在獲取語法的時候遇到了問題 - 對於這個問題,可能對引用XML元素有一些基本的困惑。SQL Server 2008 - 關於粉碎的基本問題XML

無論如何,我需要將XML像下面那樣分解成列。看起來很簡單,但我似乎無法得到正確的節點 - 或者說,我不認爲我正確地做xmlnamespaces。我還沒有發現太多有用的東西。將不勝感激任何提示!

感謝, 西爾維亞

DECLARE @pStepLogXML xml; 
select  @pStepLogXML = '<?xml version="1.0" encoding="UTF-8"?> 
<!--Sample XML file generated by XMLSpy v2010 (http://www.altova.com)--> 
<Applescommon:ActivityStepLogList xsi:schemaLocation="urn:SampleCompany:Apples:common:v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Applescommon="urn:SampleCompany:Apples:common:v1"> 
    <Applescommon:ActivityStepLog> 
     <Applescommon:GUID>3F2504E0-4F89-11D3-9A0C-0305E82C3301</Applescommon:GUID> 
     <Applescommon:ContextID>3F2504E0-4F89-11D3-9A0C-0305E82C3302</Applescommon:ContextID> 
     <Applescommon:LogType>PreStep</Applescommon:LogType> 
     <Applescommon:SourceID>com.SampleCompany.e3.es.Apples.common.ApplesCommonMessageHandler.processMessage</Applescommon:SourceID> 
     <Applescommon:LogContent><![CDATA[ 
<TestXML><XXXXXX></TestXML> 
     ]]></Applescommon:LogContent> 
     <Applescommon:LogTime>2001-12-17T09:30:47Z</Applescommon:LogTime> 
    </Applescommon:ActivityStepLog> 
    <Applescommon:ActivityStepLog> 
     <Applescommon:GUID>3F2504E0-4F89-11D3-9A0C-0305E82C3303</Applescommon:GUID> 
     <Applescommon:ContextID>3F2504E0-4F89-11D3-9A0C-0305E82C3302</Applescommon:ContextID> 
     <Applescommon:LogType>PostStep</Applescommon:LogType> 
     <Applescommon:SourceID>com.SampleCompany.e3.es.Apples.common.ApplesCommonMessageHandler.processMessage</Applescommon:SourceID> 
     <Applescommon:LogContent><![CDATA[ 
<TestXML><XXXXXX></TestXML> 
     ]]></Applescommon:LogContent> 
     <Applescommon:LogTime>2001-12-17T09:30:47Z</Applescommon:LogTime> 
    </Applescommon:ActivityStepLog> 
</Applescommon:ActivityStepLogList>'; 

with xmlnamespaces (default 'urn:Applescommon:ActivityStepLogList:v1') 
select 
    --convert(varchar(64), MyTables.MyColumns.value('Applescommon:GUID/text()', n'nvarchar(100)') 
    -- MyTable.MyColumns.value('Applescommon:GUID/text()', N'nvarchar(50)') AS Test, 
    --, 
    1 
from @pStepLogXML.nodes('/Applescommon:ActivityStepLog') 
    as T(c) 

編輯:

好了,想通了。我基本上有xmlnamespaces和節點完全搞砸了。我認爲我從代碼中複製了它們(適當地改變它們),所以如果有人願意指向我對這些的一個很好的連貫的解釋,我會給他們答案。

此外,我沒有獲取列數據的問題,所以我只是把1放在一個佔位符 - 下面我實際上放了一個真正的列。

感謝您的閱讀!

西爾維亞

with xmlnamespaces (default 'urn:SampleCompany:Apples:common:v1') 
select 
    --convert(varchar(64), MyTables.MyColumns.value('Applescommon:GUID/text()', n'nvarchar(100)') 
    -- MyTable.MyColumns.value('Applescommon:GUID/text()', N'nvarchar(50)') AS Test, 
    --, 
    T.c.query('SourceID/text()') 
    ,1 
from @pStepLogXML.nodes('/ActivityStepLogList/ActivityStepLog') 
    as T(c) 
+0

預期輸出示例? – 2010-10-27 21:32:07

回答

1

XQuery是不容易的,直到你得到它的竅門 - 我真的沒有一個「神奇」的網站,只是告訴你一切,然後你知道....我讀過的最好的介紹文章是

SQL Server 2005 XQuery and XML-DML(3部分的系列文章)

也:An Introduction to XQuery in SQL Server 2005

最重要的是:實踐中,p ractice,練習:-)沒有新的,對吧?

現在你的最後一個查詢是好的 - 但你可以更輕鬆:

with xmlnamespaces (default 'urn:SampleCompany:Apples:common:v1') 
select 
    T.C.value('(GUID)[1]', 'nvarchar(50)') AS Test, 
    T.C.value('(ContextID)[1]', 'nvarchar(50)') AS ContextID, 
    T.C.value('(SourceID)[1]', 'nvarchar(50)') AS SourceID, 
    --, 
    1 
from 
    @pStepLogXML.nodes('/ActivityStepLogList/ActivityStepLog') as T(c) 

使用.value()功能(而不是.query())爲您提供了「原子」值向右走,你也可以定義該值應該是什麼輸出數據類型。

+0

謝謝Marc!我將研究使用.value而不是.query - 我不知道爲什麼我們要在所有地方使用.query。 – Sylvia 2010-10-29 17:28:23