Я бы попытался избавиться от OpenXml и тех функций - используйте новые возможности XQuery / XPath в SQL Server 2005!
Попробуйте это - это должно дать вам значения из вашего XML:
DECLARE @XmlUpdate XML
SET @XmlUpdate =
'<root>
<row Id="1" FinYearId="5" EmployeeId="55" EnteredOn="7/1/2011 12:00:00 AM" EnteredBy="1" HouseRentPaid="False" HouseRentAmount="3500.00" officeId="9"/>
<row Id="2" FinYearId="5" EmployeeId="55" EnteredOn="7/1/2011 12:00:00 AM" EnteredBy="1" HouseRentPaid="False" HouseRentAmount="3500.00" officeId="9"/>
</root>';
SELECT
UpdRow.value('(@Id)[1]', 'int') AS 'ID',
UpdRow.value('(@FinYearId)[1]', 'int') AS 'FinYearID',
UpdRow.value('(@EmployeeId)[1]', 'int') AS 'EmployeeID',
UpdRow.value('(@EnteredOn)[1]', 'datetime') AS 'EnteredOn',
UpdRow.value('(@EnteredBy)[1]', 'int') AS 'EnteredBy',
UpdRow.value('(@HouseRentPaid)[1]', 'bit') AS 'RentPaid',
UpdRow.value('(@HouseRentAmount)[1]', 'decimal(20,4)') AS 'RentAmount',
UpdRow.value('(@OfficeId)[1]', 'int') AS 'OfficeID'
FROM
@XmlUpdate.nodes('/root/row') AS R(UpdRow)
И, конечно, если вы можете выбрать его, вы также можете использовать его для обновления!
UPDATE
dbo.EmployeeFinYearInvestment
SET
EmployeeFinYearInvestment.FinYearId = UpdRow.value('(@FinYearId)[1]', 'int'),
EmployeeFinYearInvestment.EmployeeId = UpdRow.value('(@EmployeeId)[1]', 'int'),
..... (and so on). ......
EmployeeFinYearInvestment.EnteredOn = ox.EnteredOn,
FROM
@XmlUpdate.nodes('/root/row') AS R(UpdRow)
WHERE
EmployeeFinYearInvestment.Id = UpdRow.value('(@Id)[1]', 'int');