2010-11-17 189 views
2

我有一個存儲過程是需要這樣的XML值的輸入:SQL Server 2005的XML查詢

<?xml version="1.0" encoding="utf-16"?> 
<RWFCriteria xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" reportType="Executive"> 
    <item id="44" name="" value="" type="Project" /> 
    <item id="45" name="" value="" type="Project" /> 
    <item id="46" name="" value="" type="Project" /> 
    <item id="110" name="" value="" type="Milestone" /> 
    <item id="111" name="" value="" type="Milestone" /> 
</RWFCriteria> 

我需要加入一些表,這些數據和填充DB數據name=""屬性。

如何在SQL Server 2005中解決這個問題?

在最壞的情況,我想我可以解析XML到臨時表中爲每一個類型(項目&里程碑),並加入到然後使用FOR XML

或至少一個狡猾的SQL SELECT我的數據我想我應該,還沒有得到它的工作...

任何線索?

回答

1

^好了,用這個XQuery中,你可以「分解」你的XML轉換爲僞表(一行內<RWFCriteria>每個<item>節點) - 您現在可以使用它來加入對其他表,沒有任何問題:

SELECT 
    RWF.Item.value('(@id)[1]', 'int') AS 'ID', 
    RWF.Item.value('(@name)[1]', 'varchar(50)') AS 'Name', 
    RWF.Item.value('(@type)[1]', 'varchar(50)') AS 'Type' 
FROM 
    @XmlVariableOrColumn.nodes('/RWFCriteria/item') AS RWF(Item) 

給我的輸出:

ID Name Type 
44  Project 
45  Project 
46  Project 
110  Milestone 
111  Milestone 

更新: OK,來重新創建XML,根據您的臨時表,你需要的東西是這樣的:

SELECT 
    id AS '@id', 
    projectname AS '@name', 
    VALUE AS '@value', 
    type AS '@type' 
FROM 
     #tmp t 
FOR XML PATH('item'), ROOT('RWFCriteria') 

PATH('item')定義元素爲表中的每一行,ROOT('RWFCriteria')應該是顯而易見的,並通過指定AS '@id'等你的列被選中,你如何定義那些被放入<item> - 使用@使它們成爲<item>節點上的屬性(沒有@,它們將成爲<item>中的元素)。

-1

FOR XML非常強大。

假設是這樣的:

DECLARE @p_XmlData VARCHAR(MAX) 
SELECT @p_XmlData = '<RWFCriteria xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" reportType="Executive"> 
    <item id="44" name="" value="" type="Project" /> 
    <item id="45" name="" value="" type="Project" /> 
    <item id="46" name="" value="" type="Project" /> 
    <item id="110" name="" value="" type="Milestone" /> 
    <item id="111" name="" value="" type="Milestone" /> 
</RWFCriteria>' 

這裏有一個簡單的SELECT。

DECLARE @hDoc INT 
EXEC sp_xml_preparedocument @hDoc OUTPUT, @p_XmlData 

    SELECT 
     XMLData.id, 
     1 AS [Version], 
     XMLData.name, 
     XMLData.value, 
     XMLData.[type] 
    FROM OPENXML (@hdoc, 'RWFCriteria/item', 1) 
    WITH 
    (
     id int, 
     [name] varchar(256), 
     [value] varchar(256), 
     [type] varchar(256) 
    ) AS XMLData 

    EXEC sp_xml_removedocument @hDoc 

從這裏,JOIN等是簡單的。