我在 SQL Server 2008 中有一个将 XML 数据存储在 XML 列中的表。一个典型的 XML 片段是:
<validation>
<Field1 author="56234" date="20120101" />
<Field2 author="23232" date="20120101" />
[...etc...]
</validation>
我正在尝试解决的问题-我不知道该怎么做-使用 INNER JOIN 将这些数据选择到另一个表并修改结果集中的 XML 数据,即,所以我得到了这个:
<validation>
<Field1 author="56234" date="20120101" authorFullName="Bob Smith" />
<Field2 author="23232" date="20120101" authorFullName="Jane Hill" />
[...etc...]
</validation>
现在我知道我可以CROSS APPLY
将 XML 数据直接拉入记录集并进行内部连接 - 例如:
select xmldata.a, people.personname
from xmldata
cross apply xmldata.x.nodes('/validation/node()') vdata(fielddata)
inner join people
on people.personid = vdata.fielddata.value('@author','NVARCHAR(20)')
但我真正想做的是返回原始 XML,但添加了一个新属性,将 people.PersonName 映射到新的 @authorFullName 属性。
我不能完全弄清楚语法(或者即使它确实可能)。我假设我会cross apply
做一个modify
-insert attribute
一些基于
select xmldata.a, xmldata.x
from xmldata
cross apply xmldata.x.modify('insert attribute authorFullName {sql:column("people.personfullname")} into /validation/node()')
inner join people
on people.personid = [...what goes here?...]
但是正确的语法让我无法理解。我越来越认为这是不可能的,我最好在两个查询中执行此操作并将结果合并到非 SQL 业务逻辑中。