2013-05-08 228 views
3

请考虑这个XML:插入到第n个元素的元素

<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传递给我的过程,我将一个元素插入第一个人元素。

回答

5
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 
+0

这会插入一个xml元素,而不是xml属性。这是否正确回答问题或问题不够具体? Dalex的回答更多的是添加一个XML属性... – nokturnal 2016-07-26 22:23:19

+1

@nokturnal:我相信@op是在谈论作为数据属性的属性,而不是专门针对XMLAttribute(考虑到他们的数据布局)。 – Quassnoi 2016-07-26 22:56:35

+0

100%同意这个假设...既然这是可以接受的答案,我只想指出dalex的帖子,因为它增加了一个xml属性(这正是我找到这篇文章时所寻找的) – nokturnal 2016-07-27 02:23:25

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

我需要做一些事情是这样的: SET @ XML.modify(“插入属性ID {SQL:变量( ”@ ID“) } into(/ Employees/Person)[@ myindex]') @myindex - 我在程序上得到它... – ruya 2013-05-08 10:19:51

+0

请尝试更新的答案。 – Devart 2013-05-08 10:35:37

5
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]')