Ошибка XML-запроса в SQL Server 2005 - PullRequest
0 голосов
/ 07 июля 2011

Для обновления массовой записи я использовал xml запрос. Из внешнего интерфейса (C # .net) я заполняю XML и передаю его хранимой процедуре в качестве параметра (например, @Master_rows_xml_Update).

Я сталкиваюсь с ситуацией .. когда я иду для этой команды в хранимой процедуре

declare @i INTEGER,@Master_rows_xml_Update XML;

SET  @Master_rows_xml_Update= '<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>';

exec sp_xml_preparedocument @i output, @Master_rows_xml_Update;

update EmployeeFinYearInvestment
    set EmployeeFinYearInvestment.FinYearId = ox.FinYearId,
    EmployeeFinYearInvestment.EmployeeId = ox.EmployeeId,
    EmployeeFinYearInvestment.EnteredOn = ox.EnteredOn,
    EmployeeFinYearInvestment.EnteredBy = ox.EnteredBy,
    EmployeeFinYearInvestment.HouseRentPaid = ox.HouseRentPaid,
    EmployeeFinYearInvestment.HouseRentAmount = ox.HouseRentAmount,
    EmployeeFinYearInvestment.officeId=ox.officeId

from OpenXml(@i, 'root/row')
    with (Id INT,FinYearId INT, EmployeeId INT,EnteredOn DATETIME,EnteredBy INT , HouseRentPaid BIT,HouseRentAmount DECIMAL ,officeId INT ) ox
    where EmployeeFinYearInvestment.Id = ox.Id;

exec sp_xml_removedocument @i;

.. ЭТО НЕ МОЖЕТ ОБНОВИТЬ ДЕЙСТВИЕ ПО СЛЕДУЮЩЕЙ ТАБЛИЦЕ ...

Процедура также не возвращает никаких ошибок ...

ЛЮБАЯ ИДЕЯ ...

Спасибо .. Anirban

1 Ответ

1 голос
/ 07 июля 2011

Я бы попытался избавиться от 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...