5

すべての要素がT-SQLからのIDを持つように、サードパーティのxmlを変更しようとしています。

これは元のxml(セクション)です:

<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>

ご覧のとおり、<Table>要素にはIDがないため、プロセスの後半で要素を識別するのは困難です。

<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()]:'http://www.w3.org/2001/XMLSchema#decimal?'、'http://www.w3.org/2001/XMLSchema#boolean?'のみ または'node()*'式が述語として許可され、' xs:string?'が見つかりました

これは問題なく機能しますが、常に同じ行(番号1)を変更したくありません。

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

ちなみに、文字列の代わりにint変数を使用すると、次のようになります。

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

別のエラーが発生します:

XQuery [modify()]:「挿入」のターゲットは単一ノードである必要があります。「element(TableRow、xdt:untyped)」が見つかりました*

4

2 に答える 2

2

@id変数を関数と比較できますposition()

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
于 2012-11-07T18:40:35.733 に答える
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 

うまくいけば、200を超えないでしょう...

于 2012-11-07T18:25:56.857 に答える