我有一个存储过程,它接受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选择我的数据
或者至少我认为我应该,还没有让它工作......
任何线索?
答案 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等很简单。