如何将ID分配给同一级别的xml节点

che*_*mon 5 xml t-sql insert dml

我正在尝试修改第三方xml,以便所有元素都具有来自T-SQL的Id.

这是原始的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>
Run Code Online (Sandbox Code Playgroud)

如您所见,<Table>元素没有Id,因此稍后在过程中很难识别它们.

我想创建一个循环来遍历所有<Table>元素并执行这样的代码片段:

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

问题出在最后一个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]')
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果我使用int变量而不是字符串:

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

我收到另一个错误:

XQuery [modify()]:'insert'的目标必须是单个节点,找到'element(TableRow,xdt:untyped)*

Mik*_*son 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
Run Code Online (Sandbox Code Playgroud)