sql-server
  • xml
  • xpath
  • xquery
  • 2017-09-15 80 views 0 likes 
    0

    我有以下在Sql服務器中定義的映射。用另一個xml中的映射替換屬性的值?

    declare @map xml = '<Maps><Map From="1" To="2"/><Map From="3" To="4" /></Maps>'; 
    

    我將需要改變屬性Id下面的(示例)xml使用映射的值。然而,根元素可以是任何東西,我想保留所有其他屬性。

    declare @x xml; 
    
    set @x = '<XX><Value Id="1" OtherAttrs="..." /><Value Id="3" /></XX>'; 
    -- Expect <XX><Value Id="2" OtherAttrs="..." /><Value Id="4" /></XX> 
    
    set @x = '<YY><Value Id="3" /><Value Id="1" OtherAttrs="..." /></YY>'; 
    -- Expect <YY><Value Id="4" /><Value Id="2" OtherAttrs="..." /></YY> 
    
    select @x.query('...') -- How to write the xquery? 
    

    如何編寫xquery腳本?

    如果我只有兩種根元素<XX><YY>會怎麼樣?

    +0

    這是一個錯字,我修好了。謝謝。 – ca9163d9

    回答

    0

    一個黑客一點,但考慮到以下

    declare @map xml = '<Maps><Map From="1" To="2"/><Map From="3" To="4" /></Maps>'; 
    
    Declare @X xml = '<XX><Value Id="1" /><Value Id="3" /></XX>' 
    
    Select @X = Replace(cast(@X as varchar(max)),MapFrom,MapTo) 
    From (
         Select MapFrom = 'Id="'+n.value('@From','varchar(max)')+'"' 
           ,MapTo = 'Id="'+n.value('@To' ,'varchar(max)')+'"' 
         From @map.nodes('/Maps/*') as X(n) 
        ) A 
    
    Select @X 
    

    返回

    <XX> 
        <Value Id="2" /> 
        <Value Id="4" /> 
    </XX> 
    

    如果與可視化有助於

    子查詢生成以下內容。

    MapFrom MapTo 
    Id="1" Id="2" 
    Id="3" Id="4" 
    

    您可能會注意到我包括完整的字符串{attribute name}="{value}"這是爲了避免碰撞和過度擴張。

    相關問題