Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Xml Ağaç Yapısını Almak
#1
Xml'in yapısını ağaç olarak bize veren hazır bir Table Function
CREATE FUNCTION [dbo].[udf-XML-Hier](@XML xml)

Returns Table 
As Return

with  cte0 as ( 
                 Select Lvl       = 1
                       ,ID        = Cast(1 as int) 
                       ,Pt        = Cast(NULL as int)
                       ,Element   = x.value('local-name(.)','varchar(150)')
                       ,Attribute = cast('' as varchar(150))
                       ,Value     = x.value('text()[1]','varchar(max)')
                       ,XPath     = cast(concat(x.value('local-name(.)','varchar(max)'),'[' ,cast(Row_Number() Over(Order By (Select 1)) as int),']') as varchar(max))
                       ,Seq       = cast(10000001 as varchar(max))
                       ,AttData   = x.query('.') 
                       ,XMLData   = x.query('*') 
                 From   @XML.nodes('/*') a(x) 
                 Union  All
                 Select Lvl       = p.Lvl + 1 
                       ,ID        = Cast( (Lvl + 1) * 1024 + (Row_Number() Over(Order By (Select 1)) * 2) as int ) * 10
                       ,Pt        = p.ID
                       ,Element   = c.value('local-name(.)','varchar(150)')
                       ,Attribute = cast('' as varchar(150))
                       ,Value     = cast( c.value('text()[1]','varchar(max)') as varchar(max) ) 
                       ,XPath     = cast(concat(p.XPath,'/',c.value('local-name(.)','varchar(max)'),'[',cast(Row_Number() Over(PARTITION BY c.value('local-name(.)','varchar(max)') Order By (Select 1)) as int),']') as varchar(max) )
                       ,Seq       = cast(concat(p.Seq,' ',10000000+Cast( (Lvl + 1) * 1024 + (Row_Number() Over(Order By (Select 1)) * 2) as int ) * 10) as varchar(max))
                       ,AttData   = c.query('.') 
                       ,XMLData   = c.query('*') 
                 From   cte0 p 
                 Cross  Apply p.XMLData.nodes('*') b© 
             )
   , cte1 as (   
                 Select R1 = Row_Number() over (Order By Seq),A.*
                 From  (
                         Select  Lvl,ID,Pt,Element,Attribute,Value,XPath,Seq From cte0
                         Union All
                         Select Lvl       = p.Lvl+1
                               ,ID        = p.ID + Row_Number() over (Order By (Select NULL)) 
                               ,Pt        = p.ID
                               ,Element   = p.Element
                               ,Attribute = x.value('local-name(.)','varchar(150)')
                               ,Value     = x.value('.','varchar(max)')
                               ,XPath     = p.XPath + '/@' + x.value('local-name(.)','varchar(max)')
                               ,Seq       = cast(concat(p.Seq,' ',10000000+p.ID + Row_Number() over (Order By (Select NULL)) ) as varchar(max))
                         From   cte0 p 
                         Cross  Apply AttData.nodes('/*/@*') a(x) 
                       ) A 
              )

Select A.R1
     ,R2  = IsNull((Select max(R1) From cte1 Where Seq Like A.Seq+'%'),A.R1)
     ,A.Lvl
     ,A.ID
     ,A.Pt
     ,A.Element
     ,A.Attribute
     ,A.XPath
     ,Title = Replicate('|---',Lvl-1)+Element+IIF(Attribute='','','@'+Attribute)
     ,A.Value
From  cte1 A

/*
Source: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Declare @XML xml='<person><firstname preferred="Annie" nickname="BeBe">Annabelle</firstname><lastname>Smith</lastname></person>'
Select * from [dbo].[udf-XML-Hier](@XML) Order by R1
*/

--Xmlin yapısını ağaç şeklinde döndürür
Narsist bir ruhta başkasına ihtiyaç yoktur !
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi