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>
これで、XMLデータをレコードセットに直接プルして内部結合することができることがわかりCROSS APPLY
ました。たとえば、次のようにします。
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?...]
しかし、構文を正しく理解することは私を逃れています。私はますますそれが不可能だと考えています。これを2つのクエリで実行し、結果を非SQLビジネスロジックにマージすることをお勧めします。