2013-05-08 126 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]')