存储过程中的SQL Server 2005 XML查询

时间:2010-11-17 17:33:40

标签: 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>

我需要将一些表连接到此数据,并使用数据库数据填充name=""属性。

如何在SQL Server 2005中解决此问题?

在最坏的情况下,我认为我可以将XML解析为两种类型(项目和里程碑)中的每一种的临时表,然后加入到那里,然后使用FOR XML的狡猾的SQL选择我的数据

或者至少我认为我应该,还没有让它工作......

任何线索?

2 个答案:

答案 0 :(得分:1)

^好吧,使用这个XQUery,你可以将你的XML“碎化”成一个伪表(<item>内的每个<RWFCriteria>节点一行) - 你现在可以用它来加入其他表,没问题:

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

更新:好的,根据临时表重新创建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 :(得分:-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等很简单。

相关问题