SQL Server 2005中的XML查询错误

时间:2011-07-07 13:09:31

标签: sql sql-server-2005

为了更新群发记录,我使用了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 个答案:

答案 0 :(得分:1)

我会尝试摆脱OpenXml和那些功能 - 在SQL Server 2005中使用新的XQuery / XPath东西!

试试这个 - 这应该为您提供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');