2011-10-04 49 views
15

中選擇XML文件中的數據有人能告訴我一些TSQL用來查詢xml文件,就像它是一個表一樣嗎?從TSQL

的文件是服務器上的 「C:\ xmlfile.xml」

並含有

<ArrayOfSpangemansFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SpangemansFilter> 
     <FilterID>1219</FilterID> 
     <Name>Fred</Name> 
     <Code>510</Code> 
     <Department>N</Department> 
     <Number>305327</Number> 
    </SpangemansFilter> 
    <SpangemansFilter> 
     <FilterID>3578</FilterID> 
     <Name>Gary</Name> 
     <Code>001</Code> 
     <Department>B</Department> 
     <Number>0692690</Number> 
    </SpangemansFilter> 
    <SpangemansFilter> 
     <FilterID>3579</FilterID> 
     <Name>George</Name> 
     <Code>001</Code> 
     <Department>X</Department> 
     <Number>35933</Number> 
    </SpangemansFilter> 
</ArrayOfSpangemansFilter> 

示例輸出我

FilterID |Name  |Code  |Department    |Number 
------------------------------------------------------------------- 
1219  |Fred  |510  |N      |305327 
3578  |Gary  |001  |B      |0692690 
3579  |George  |001  |X      |35933 

回答

25
set @xmlData='<?xml version="1.0"?> 
<ArrayOfSpangemansFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<SpangemansFilter> 
<FilterID>1219</FilterID> 
<Name>Fred</Name> 
<Code>510</Code> 
<Department>N</Department> 
<Number>305327</Number> 
</SpangemansFilter> 
<SpangemansFilter> 
<FilterID>3578</FilterID> 
<Name>Gary</Name> 
<Code>001</Code> 
<Department>B</Department> 
<Number>0692690</Number> 
</SpangemansFilter> 
<SpangemansFilter> 
<FilterID>3579</FilterID> 
<Name>George</Name> 
<Code>001</Code> 
<Department>X</Department> 
<Number>35933</Number> 
</SpangemansFilter> 
</ArrayOfSpangemansFilter>' 


SELECT 
    ref.value('FilterID[1]', 'int') AS FilterID , 
    ref.value('Name[1]', 'NVARCHAR (10)') AS Name , 
    ref.value('Code[1]', 'NVARCHAR (10)') AS Code , 
    ref.value('Department[1]', 'NVARCHAR (3)') AS Department, 
    ref.value('Number[1]', 'int') AS Number  
FROM @xmlData.nodes('/ArrayOfSpangemansFilter/SpangemansFilter') 
xmlData(ref) 

主要生產後:

FilterID Name  Code  Department Number 
----------- ---------- ---------- ---------- ----------- 
1219  Fred  510  N   305327 
3578  Gary  001  B   692690 
3579  George  001  X   35933 

注意:需要[1]來指示您要選擇序列的第一個值,因爲查詢可能每行返回多個匹配值(想象您的XML包含每個SpangemansFilter的多個FilterID)。

我認爲這是需要了解的,所以我用Google搜索,並看了很多帖子,直到我發現this one.

UPDATE 從文件加載:

DECLARE @xmlData XML 
SET @xmlData = (
    SELECT * FROM OPENROWSET (
    BULK 'C:\yourfile.xml', SINGLE_CLOB 
) AS xmlData 
) 

SELECT @xmlData

+0

這很好,但是您不指定如何從XML文件而不是@xmlData變量執行此操作。該文件在服務器上,「C:\ xmlfile.xml」 – Hoody

+1

@spangeman看到我的更新 – Icarus

+0

完美的作品謝謝你! – Hoody

0

就我而言 - 我感興趣的數據包含在節點屬性中而不是值中。下面包含了一個如何訪問屬性的例子。

DECLARE @xmlData XML 
set @xmlData='<?xml version="1.0"?> 
<ArrayOfSpangemansFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<SpangemansFilter FilterID="1219" Name="Fred" Code="510" Department="N" Number="305327"> 
</SpangemansFilter> 
<SpangemansFilter FilterID="3578" Name="Gary" Code="001" Department="B" Number="0692690"> 
</SpangemansFilter> 
<SpangemansFilter FilterID="3579" Name="George" Code="001" Department="X" Number="35933"> 
</SpangemansFilter> 
</ArrayOfSpangemansFilter>' 


SELECT 
    ref.value('@FilterID', 'int') AS FilterID , 
    ref.value('@Name', 'NVARCHAR (10)') AS Name , 
    ref.value('@Code', 'NVARCHAR (10)') AS Code , 
    ref.value('@Department', 'NVARCHAR (3)') AS Department, 
    ref.value('@Number', 'int') AS Number  
FROM @xmlData.nodes('/ArrayOfSpangemansFilter/SpangemansFilter') 
xmlData(ref)