2012-11-07 19 views
5

すべての要素がT-SQLのIDを持つようにサードパーティXMLを変更しようとしています。あなたが見ることができるように、<Table>要素はIDを持っていないので、後の工程においてそれらを識別することは困難である同じレベルの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>の要素を通過し、次のようにスニペットを実行するループを作成したいと思います:

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

問題は最後のSQL変数であり、誤差は次のとおりです。

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

ではありません。

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

私が思い付くことができる唯一のこと(トイレを流している誰かが聞いた?)

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 

うまくいけば、あなたはposition()を機能させる変数@idを比較することができ、200以上...

関連する問題