在Sql Server中向XML的第n个元素插入一个元素

3
请考虑以下XML:

请注意以下XML:

<Employees>
    <Person>
        <ID>1000</ID>
        <Name>Nima</Name>
        <LName>Agha</LName>
    </Person>
    <Person>
        <ID>1001</ID>
        <Name>Ligha</Name>
        <LName>Ligha</LName>
    </Person>
    <Person>
        <ID>1002</ID>
        <Name>Jigha</Name>
        <LName>Jigha</LName>
    </Person>
    <Person>
        <ID>1003</ID>
        <Name>Aba</Name>
        <LName>Aba</LName>
    </Person>
</Employees>

我希望编写一个过程,它可以获取一个数字,然后将元素插入到第n个人的元素中。例如,如果传递1给我的过程,我将元素插入到第一个人的元素中。

3个回答

6
DECLARE @data XML =
'
<Employees>
    <Person>
        <ID>1000</ID>
        <Name>Nima</Name>
        <LName>Agha</LName>
    </Person>
    <Person>
        <ID>1001</ID>
        <Name>Ligha</Name>
        <LName>Ligha</LName>
    </Person>
    <Person>
        <ID>1002</ID>
        <Name>Jigha</Name>
        <LName>Jigha</LName>
    </Person>
    <Person>
        <ID>1003</ID>
        <Name>Aba</Name>
        <LName>Aba</LName>
    </Person>
</Employees>
'

DECLARE @offset INT = 2
DECLARE @value VARCHAR(100) = 'newvalue'

SET @data.modify('insert <NewAttribute>{sql:variable("@value")}</NewAttribute> as last into (/Employees/Person)[sql:variable("@offset")][1]')

SELECT @data

这会插入一个XML元素,而不是XML属性。这个回答是否恰当,还是问题不够明确?Dalex的回答更适用于添加XML属性... - nokturnal
1
@nokturnal:我认为@op所说的属性是指数据属性,而不是特定的XMLAttribute(考虑到他们的数据布局)。 - Quassnoi
完全同意这个假设...既然这是被接受的答案,我只想指出dalex的帖子,因为它添加了一个xml属性(这就是我找到这篇文章时正在寻找的)。 - nokturnal

4
DECLARE @AttributeValue NVARCHAr(100) = 'TestValue';
DECLARE @NodeNR INT = 3
DECLARE @XML XML = '<Employees>
    <Person>
        <ID>1000</ID>
        <Name>Nima</Name>
        <LName>Agha</LName>
    </Person>
    <Person>
        <ID>1001</ID>
        <Name>Ligha</Name>
        <LName>Ligha</LName>
    </Person>
    <Person>
        <ID>1002</ID>
        <Name>Jigha</Name>
        <LName>Jigha</LName>
    </Person>
    <Person>
        <ID>1003</ID>
        <Name>Aba</Name>
        <LName>Aba</LName>
    </Person>
</Employees>';
SET @XML.modify('insert attribute Attribute {sql:variable("@AttributeValue")} into (/Employees/Person[position()=sql:variable("@NodeNr")])[1]')

0

试试这个 -

DECLARE @Param INT = 1000
DECLARE @NodeID INT = 2

DECLARE @XML XML = '
<Employees>
    <Person>
        <ID>1000</ID>
        <Name>Nima</Name>
        <LName>Agha</LName>
    </Person>
    <Person>
        <ID>1001</ID>
        <Name>Ligha</Name>
        <LName>Ligha</LName>
    </Person>
    <Person>
        <ID>1002</ID>
        <Name>Jigha</Name>
        <LName>Jigha</LName>
    </Person>
    <Person>
        <ID>1003</ID>
        <Name>Aba</Name>
        <LName>Aba</LName>
    </Person>
</Employees>'

DECLARE @SQL NVARCHAR(MAX) = '

DECLARE @XML XML = @XML_Param
DECLARE @Id INT = @Value_Param

SET @XML.modify(''insert attribute Id {sql:variable("@Id")} into (/Employees/Person)[' + CAST(@NodeID AS VARCHAR) + ']'')

SELECT @XML_Output = @XML'

DECLARE @Definition NVARCHAR(500) = 
    N'@XML_Param XML, @Value_Param INT, @Node_Param INT, @XML_Output XML OUTPUT'

DECLARE @XMLResult XML

EXEC sys.sp_executesql
      @SQL
    , @Definition
    , @XML_Param = @XML
    , @Value_Param = @Param
    , @Node_Param = 1
    , @XML_Output = @XMLResult OUTPUT

SELECT @XMLResult

我需要做类似于这样的事情: SET @XML.modify('insert attribute Id {sql:variable("@Id")} into (/Employees/Person)[@myindex]') @myindex - 我在过程中获取它... - ruya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接