sql 读取xml文件 解析xml文件方法

 sql 读取xml文件 解析xml文件方法

declare @xml xml =
'<OdfBody DocumentType="DT_General" Time="1587952200" Date="2020-04-27" Source="CENTER" Version="62" LogicalDate="2020-04-27" CompetitionCode="0001" DocumentCode="PFT0001----------------">
    <Competition SportName="010001体能达标测试" EndDate="2020-04-25" BeginDate="2020-04-25" SportCode="0001" BatchCode="01">
        <Batch Code="01" Name="自测TEXT">
            <CompetitionRule Score="1.0" Level="达标"/>
            <Venue Venue="V001" VenueName="xxx体育馆" LocationName="" Location=""/>
            <Discipline Order="1" Code="003" DisciplineName="板块体能测试" GroupCode="0001" GroupName="组一">
                <DisplineRule Score="80.0" Level="达标"/>
                <Event Order="1" EventName="80%以上最大心率保持时间" Unit="s" EventCode="202" ExtInfo=""/>
                <Event Order="2" EventName="攀爬机距离" Unit="m" EventCode="201" ExtInfo=""/>
            </Discipline>
            <Discipline Order="2" Code="002" DisciplineName="躯干稳定性得分和力量均衡性测试" GroupCode="0001" GroupName="组一">
                <DisplineRule Score="70.0" Level="达标"/>
                <Event Order="1" EventName="上肢峰值功率" Unit="w" EventCode="111" ExtInfo=""/>
                <Event Order="2" EventName="下肢比值 %" Unit="%" EventCode="110" ExtInfo=""/>
                <Event Order="3" EventName="下肢峰值功率" Unit="w" EventCode="112" ExtInfo=""/> 
            </Discipline>
            <Discipline Order="3" Code="001" DisciplineName="基础体能测试" GroupCode="0001" GroupName="组一">
                <DisplineRule Score="60.0" Level="达标"/>
                <Event Order="1" EventName="2000m测功仪" Unit="s" EventCode="016" ExtInfo=""/>
                <Event Order="2" EventName="引体向上" Unit="s" EventCode="011" ExtInfo=""/>
                <Event Order="3" EventName="垂直纵跳" Unit="cm" EventCode="006" ExtInfo=""/> 
            </Discipline>
        </Batch>
    </Competition>
</OdfBody>'
--declare @xml xml
--set @xml = @xmlStr
----------------------------------
create table #Disc(
	[index] int identity(1,1),
	Code nvarchar(50),
	DisciplineName nvarchar(50),
	GroupCode nvarchar(50),
	[Order]  nvarchar(50),
	F_IsActive int
)

create table #DiscRule( 
	[index] int identity(1,1),
	Code nvarchar(50),
	DisciplineName nvarchar(50),
	GroupCode nvarchar(50),
	[Order]  nvarchar(50),
	F_IsActive int,
	Score NVARCHAR(50),
	Levelss nvarchar(50)
)

create table #T1( 
	[index] int identity(1,1),
	Score NVARCHAR(50),
	Levelss nvarchar(50),
	 DisciplineName nvarchar(50), 
	 sportid nvarchar(50),
	  Code nvarchar(50), 
	  IsActive nvarchar(50) , 
	  [Order]  nvarchar(50)
)
	
CREATE TABLE #DANDE(
	DCode nvarchar(50),
	GroupCode nvarchar(50),  
	ECode nvarchar(50) ,
	Evename nvarchar(50),
	Unit nvarchar(50),
	ExtInfo nvarchar(50)
)
CREATE TABLE #Competition(
	SportName NVARCHAR(50),
	EndDate DATETIME,
	BeginDate DATETIME,
	SportCode NVARCHAR(50),
	BatchCode NVARCHAR(50)
)

--------------------------------------- 
 --Competition OK
INSERT INTO #Competition(SportName,BeginDate,EndDate,SportCode,BatchCode)
SELECT 
	C.value('@SportName[1]','NVARCHAR(50)') AS SportName,
	C.value('@EndDate[1]','DATETIME') AS EndDate,
	C.value('@BeginDate[1]','DATETIME') AS BeginDate,
	C.value('@SportCode[1]','NVARCHAR(50)') AS SportCode,
	C.value('@BatchCode[1]','NVARCHAR(50)') AS BatchCode
	FROM @xml.nodes('/OdfBody/Competition') T(C)  
-- select * from #Competition
 declare @SportCode nvarchar(50) ='0001'
 declare @sportcount int

  select @sportcount=count(*) from  [dbo].[TS_Sport] sp where sp.F_RSCcode= @SportCode 
  if	(@sportcount>0)
		begin
			delete  from   [dbo].[TS_Sport]  where F_RSCcode= @SportCode;
			insert into [dbo].[TS_Sport] select comp.SportName,comp.SportCode,'11',comp.BeginDate,comp.EndDate,'' from #Competition as comp;
		end
  else	
		begin
			insert into [dbo].[TS_Sport] select comp.SportName,comp.SportCode,'11',comp.BeginDate,comp.EndDate,'' from #Competition as comp;
		end
		
 --Competition OK
 ---------------------------------------
 select * from #Competition

 --------------------------------------- 
 CREATE TABLE #Venue(
	Venue NVARCHAR(50), 
	VenueName NVARCHAR(50) 
)
 --Venue OK
INSERT INTO #Venue(Venue,VenueName)
SELECT 
	C.value('@Venue[1]','NVARCHAR(50)') AS Venue, 
	C.value('@VenueName[1]','NVARCHAR(50)') AS VenueName 
	FROM @xml.nodes('/OdfBody/Competition/Batch/Venue') T(C)  
-- select * from #Competition
 declare @Venue nvarchar(50) 
 declare @VenueName nvarchar(50)
 declare @venueCount nvarchar(50)

  select @venueCount=count(*) from [dbo].[TC_Venue] v where v.F_VenueName= @VenueName and v.F_RSCcode=@Venue
  if	(@venueCount<1)
		begin 
			insert into [dbo].[TC_Venue] select v.VenueName,v.Venue  from #Venue as v;
		end 
		select * from #Venue
 --Venue OK
 ---------------------------------------



 --------------------------------------- 
 CREATE TABLE #OdfBody(
	oDocumentType NVARCHAR(50), 
	oTime NVARCHAR(50), 
	oDate datetime, 
	oSource NVARCHAR(50), 
	oVersion NVARCHAR(50),
	oLogicalDate datetime,
	oCompetitionCode NVARCHAR(50),
	oDocumentCode NVARCHAR(50) 
)
 
  
 --Batch    OK
 CREATE TABLE #Batch(
	BatchCode NVARCHAR(50),
	BatchName NVARCHAR(50) 
)
INSERT INTO #Batch(BatchCode,BatchName)
SELECT 
	C.value('@Code[1]','NVARCHAR(50)') AS BatchCode,   -- code==order 
	C.value('@Name[1]','NVARCHAR(50)') AS BatchName 
	FROM @xml.nodes('/OdfBody/Competition/Batch/Venue') T(C) 

  
  declare @BatchName nvarchar(50)  
  declare @BatchOrder nvarchar(50)  
  declare @batchCount int
  select @BatchName=le.F_LevelName,@BatchOrder=le.F_Order from [dbo].[TC_level] le 
  
 select @venueCount=count(*) from [dbo].[TC_Venue] v where v.F_VenueName= @VenueName and v.F_RSCcode=@Venue
  if	(@venueCount<1)
		begin 
			insert into [dbo].[TC_level]    select  b.BatchName,b.BatchCode   from #Batch   b
		end 
		select * from #Batch
 --Batch   OK    
---------------------------------TC_Event------------------TC_Discipline-------------------------------------
declare @i int = 1
insert into #Disc(Code,DisciplineName,GroupCode,[Order],F_IsActive)
 SELECT
    C.value('@Code[1]','NVARCHAR(50)') AS Code,
    C.value('@DisciplineName[1]','NVARCHAR(50)') AS DisciplineName,
    C.value('@GroupCode[1]','NVARCHAR(50)') AS GroupCode,
	C.value('@Order[1]','NVARCHAR(50)') AS [Order],
	1  
  FROM @xml.nodes('/OdfBody/Competition/Batch/Discipline') T(C)


insert into #DiscRule(Score,Levelss)
 SELECT
    C.value('@Score[1]','NVARCHAR(50)') AS Score,
    C.value('@Level[1]','NVARCHAR(50)') AS  [Level]
  FROM @xml.nodes('/OdfBody/Competition/Batch/Discipline/DisplineRule') T(C)

    

 declare @DC nvarchar(50),@GC nvarchar(50) 
 declare @dCount int = 0
 select @dCount= count(*) from #Disc

  -------------------------------------- 
  --  ru.Levelss,(达标) select * from [TC_Discipline]
  --直接插入
   insert into [dbo].[TC_Discipline]  select d.DisciplineName ,1 传入参数sport,d.Code,1 初始有效 ,ru.Score,d.[Order] from #DiscRule ru left join #Disc d on d.[index]=ru.[index]; 
 ---------------------------------------
	
 while @i<=@dCount
 begin
	select top 1 @DC = Code,@GC = GroupCode from #Disc where [index]= @i

	insert into #DANDE
	SELECT
	@DC,@GC, 
    C.value('@EventCode[1]','NVARCHAR(50)') AS EventCode,
    C.value('@EventName[1]','NVARCHAR(50)') AS EventName,
    C.value('@Unit[1]','NVARCHAR(50)') AS Unit,
    C.value('@ExtInfo[1]','NVARCHAR(50)') AS ExtInfo 
	FROM @xml.nodes('/OdfBody/Competition/Batch/Discipline[@Code=sql:variable("@DC")][@GroupCode=sql:variable("@GC")]/Event') T(C) 
	set @i=@i+1
 end 
---------------------------------TC_Event------------------TC_Discipline-------------------------------------
 
  
						--插入 TC_Event--
   --直接插入   insert into [dbo].[TC_Event] select g.Evename,g.DCode,g.ECode,1,1,1,1 from #DANDE g
						--插入 TC_Event--
  
  ------------------
  drop table #T1
  drop table #Disc
  drop table #DANDE  
  drop table #DiscRule
  drop table #Competition
  drop table #Batch
  drop table #OdfBody
  drop table #Venue





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值