2012-11-07 17 views
5

제 3 자 XML을 수정하여 모든 요소가 T-SQL의 ID를 갖도록하려고합니다. 당신이 볼 수 있듯이, <Table> 요소 아이디의이없는동일한 레벨의 XML 노드에 ID를 할당하는 방법

<Tables> 
    <Table Type="LineItem"> 
     <TableRow> 
     <Field Name="LI_NominalCode" Type="wd_lit_nominalcode">244234</Field> 
     <Field Name="LI_NominalDesc" Type="lit_nominaldesc">RENT RECEIVABLE - INTERNAL</Field> 
     <Field Name="LI_Account" Type="lit_wd_account" /> 
     <Field Name="LI_AccountDesc" Type="lit_wd_accountdesc" /> 
     <Field Name="LI_SecondAccount" Type="lit_wd_2ndaccount" /> 
     <Field Name="LI_SecondAccountDesc" Type="lit_wd_2ndaccountdesc" /> 
     <Field Name="LI_NetValue" Type="lit_vatexcludedamount">4522.89</Field> 
     <Field Name="LI_EnergyUsage" Type="wd_energyusage">56666</Field> 
     <Field Name="LI_EnergyType" Type="wd_energytype">ELECTRICITY</Field> 
     </TableRow> 
     <TableRow> 
     <Field Name="LI_NominalCode" Type="wd_lit_nominalcode">150021</Field> 
     <Field Name="LI_NominalDesc" Type="lit_nominaldesc">Rent Building 1</Field> 
     <Field Name="LI_Account" Type="lit_wd_account" /> 
     <Field Name="LI_AccountDesc" Type="lit_wd_accountdesc" /> 
     <Field Name="LI_SecondAccount" Type="lit_wd_2ndaccount" /> 
     <Field Name="LI_SecondAccountDesc" Type="lit_wd_2ndaccountdesc" /> 
     <Field Name="LI_NetValue" Type="lit_vatexcludedamount">456.37</Field> 
     <Field Name="LI_EnergyUsage" Type="wd_energyusage">2805.00</Field> 
     <Field Name="LI_EnergyType" Type="wd_energytype">ELECTRICITY</Field> 
     </TableRow> 
     <TableRow> 
     <Field Name="LI_NominalCode" Type="wd_lit_nominalcode">2342341</Field> 
     <Field Name="LI_NominalDesc" Type="lit_nominaldesc">Rent Building 2</Field> 
     <Field Name="LI_Account" Type="lit_wd_account" /> 
     <Field Name="LI_AccountDesc" Type="lit_wd_accountdesc" /> 
     <Field Name="LI_SecondAccount" Type="lit_wd_2ndaccount" /> 
     <Field Name="LI_SecondAccountDesc" Type="lit_wd_2ndaccountdesc" /> 
     <Field Name="LI_NetValue" Type="lit_vatexcludedamount">355</Field> 
     <Field Name="LI_EnergyUsage" Type="wd_energyusage">6900</Field> 
     <Field Name="LI_EnergyType" Type="wd_energytype">ELECTRICITY</Field> 
     </TableRow> 
    </Table> 
    <Table Type="BankAccountTable" /> 
    <Table Type="VATTable" /> 
    </Tables> 

그래서 나중에 그 과정에서 그들을 확인하는 것이 어려울 수 있습니다 :

이 원래 XML (절)입니다.

나는 모든 <Table> 요소를 통해 이동과 같은 조각 실행하는 루프를 만들고 싶습니다

문제는 마지막 SQL 변수에 놓여
set @xml.modify(' 
insert attribute ID {sql:variable("@idString")} 
into (/Documents/Document/Invoice/Tables/Table[@Type="LineItem"]/TableRow)[sql:variable("@id")]') 

오류는 다음과 같습니다

XQuery [modify()]: Only 'http://www.w3.org/2001/XMLSchema#decimal?', 'http://www.w3.org/2001/XMLSchema#boolean?' or 'node()*' expressions allowed as predicates, found 'xs:string ?'

잘 작동하지만 항상 같은 행 (1 번)을 변경하고 싶지 않습니다. 내가 같은 문자열 대신 INT 변수를 사용하는 경우 그런데

set @xml.modify(' 
insert attribute ID {sql:variable("@idString")} 
into (/Documents/Document/Invoice/Tables/Table[@Type="LineItem"]/TableRow)[1]') 

:

set @xml.modify('insert attribute ID {sql:variable("@idString")} 
       into (/Documents/Document/Invoice/Tables/Table[@Type="LineItem"]/TableRow)[sql:variab‌​le("@idInt")]')` 

나는 또 다른 오류가 발생합니다 :

XQuery [modify()]: The target of 'insert' must be a single node, found 'element(TableRow,xdt:untyped) *

답변

2

당신은 position()를 작동하려면 변수 @id을 비교할 수 없게됩니다.

declare @id int 
declare @RowCount int 
select @RowCount = @xml.value('count(/Tables/Table[@Type="LineItem"]/TableRow)', 'int') 

set @id = 1 

while @id <= @RowCount 
begin 
    set @xml.modify(' 
    insert attribute ID {sql:variable("@id")} 
    into (/Tables/Table[@Type="LineItem"]/TableRow[position()=sql:variable("@id")])[1]') 

    set @id = @id + 1 
end 
+0

Genious! 매력처럼 작동했지만, [1] 또한 요소의 위치를 ​​가리키는 데 사용될 수 있기 때문에 분명하지 않았습니다. – checamon

1

내가 올 수있는 유일한 방법 with 가능한 모든 행을 가진 저장 프로 시저 (화장실을 내뿜는 누군가 들었습니까?)

,210
if (@row = 1) 
BEGIN 
    set @xml.modify(' 
     insert attribute ID {sql:variable("@id")} 
     into (/Documents[1]/Document[1]/Invoice[1]/Tables[1]/Table[@Type="LineItem"][1]/TableRow)[1] 
     ') 
END 
ELSE if (@row = 2) 
BEGIN 
    set @xml.modify(' 
     insert attribute ID {sql:variable("@id")} 
     into (/Documents[1]/Document[1]/Invoice[1]/Tables[1]/Table[@Type="LineItem"][1]/TableRow)[2] 
     ') 
END 
ELSE if (@row = 3) 
BEGIN 
    set @xml.modify(' 
     insert attribute ID {sql:variable("@id")} 
     into (/Documents[1]/Document[1]/Invoice[1]/Tables[1]/Table[@Type="LineItem"][1]/TableRow)[3] 
     ') 
END 

희망은 200 개 이상의 ...

관련 문제