Reputation: 413
Im trying to insert XML data in a temporary table
DEPARTMENT name="Administration" Revision="" IsRevision="False" Configuration="">
<FIELD name="Name" value="Jean" type="char" />
<FIELD name="LastName" value="Dupont" type="char" />
<FIELD name="EmployeeID" value="5" type="float" />
<ATTACHED_DOCUMENTS>
<DOCUMENT FileName="contract.pdf" Directory="D:/Contracts"/>
</ATTACHED_DOCUMENTS>
</DEPARTMENT>
insert #t_employee
(t_department,
t_name,
t_value,
t_type)
select *
from openxml (@doc, 'DEPARTMENT/FIELD')
with (t_department varchar(255) '../@name',
t_name varchar(255) '@name',
t_value varchar(255) '@value',
t_type varchar(max) '@type');
This code works. But now what I want is to add a column in my table and get the information of the document in the "Attached_documents" tag.
I tried to change the path like this to add it but it didnt work
select *
from openxml (@doc, 'DEPARTMENT)
with (t_department varchar(255) '@name',
t_name varchar(255) 'FIELD/@name',
t_value varchar(255) 'FIELD/@value',
t_type varchar(max) 'FIELD/@type',
t_document varchar(max) 'ATTACHED_DOCUMENTS/@FileName');
How can I insert the document info in my table?
Thanks for help
Upvotes: 0
Views: 33
Reputation: 7928
Since I don't have access to your XML doc I need to use a variable; hopefully this makes enough sense for you to make the required changes.
-- your XML doc
DECLARE @doc XML =
'<DEPARTMENT name="Administration" Revision="" IsRevision="False" Configuration="">
<FIELD name="Name" value="Jean" type="char" />
<FIELD name="LastName" value="Dupont" type="char" />
<FIELD name="EmployeeID" value="5" type="float" />
<ATTACHED_DOCUMENTS>
<DOCUMENT FileName="contract.pdf" Directory="D:/Contracts"/>
</ATTACHED_DOCUMENTS>
</DEPARTMENT>'
-- Solution
select
DepartmentName = FIELD.value('(../@name)[1]', 'varchar(100)'),
FieldName = FIELD.value('(@name)[1]', 'varchar(100)'),
FieldTxt = FIELD.value('(@value)[1]', 'varchar(100)'),
FieldType = FIELD.value('(@type)[1]', 'varchar(100)'),
[FileName] = info.value('(DOCUMENT/@FileName)[1]', 'varchar(100)'),
FileDirectory = info.value('(DOCUMENT/@Directory)[1]', 'varchar(100)')
FROM (VALUES (@doc)) t(x)
CROSS APPLY x.nodes('/DEPARTMENT/FIELD') FIELDS(FIELD)
CROSS APPLY (VALUES (@doc.query('(//DOCUMENT)'))) doc(info);
Results
DepartmentName FieldName FieldTxt FieldType FileName FileDirectory
-------------- -------------- -------------- -------------- -------------- --------------
Administration Name Jean char contract.pdf D:/Contracts
Administration LastName Dupont char contract.pdf D:/Contracts
Administration EmployeeID 5 float contract.pdf D:/Contracts
Upvotes: 1