sql for xml query sample

sample 1:

declare @x xml
   
select @x='<ArrayOfScheduledTime>
  <ScheduledTime>
    <RecurrenceType>EveryMonday</RecurrenceType>
    <Stamp>
      <dateTime>2000-01-01T19:30:00</dateTime>
    </Stamp>
  </ScheduledTime>
  <ScheduledTime>
    <RecurrenceType>EveryThursday</RecurrenceType>
    <Stamp>
      <dateTime>2000-01-01T19:30:00</dateTime>
    </Stamp>
  </ScheduledTime>
  <ScheduledTime>
    <RecurrenceType>EverySunday</RecurrenceType>
    <Stamp>
      <dateTime>2000-01-01T19:30:00</dateTime>
    </Stamp>
  </ScheduledTime>
</ArrayOfScheduledTime>'

SELECT N.v.value('.' , 'VARCHAR(100)')B 
FROM @x.nodes('/ArrayOfScheduledTime/ScheduledTime/RecurrenceType')N(v)

/*
EveryMonday
EveryThursday
EverySunday
*/

select @x.query('/ArrayOfScheduledTime/ScheduledTime/RecurrenceType')
/*
<RecurrenceType>EveryMonday</RecurrenceType>
<RecurrenceType>EveryThursday</RecurrenceType>
<RecurrenceType>EverySunday</RecurrenceType>
*/

select o.value('RecurrenceType[1]','varchar(20)') 'RecurrenceType'
 from (select @x 'x') t
 cross apply x.nodes('/ArrayOfScheduledTime/ScheduledTime') x(o)
 
/*
RecurrenceType
--------------------
EveryMonday
EveryThursday
EverySunday
 
(3 行受影响)
*/

DECLARE @handel int;
EXEC sp_xml_preparedocument @handel output, @x
SELECT * from OPENXML(@handel,'/ArrayOfScheduledTime/ScheduledTime',2)
WITH(RecurrenceType varchar(50)) 

EXEC sp_xml_removedocument @handel

/**************结果*****************
EveryMonday
EveryThursday
EverySunday
*/

sample2:

DECLARE @xDailyConfig XML
set @xDailyConfig='<ArrayOfScheduledTime>
  <ScheduledTime>
    <RecurrenceType>Everyday</RecurrenceType>
    <Stamp>
      <dateTime>2000-01-01T09:00:00</dateTime>
      <dateTime>2000-01-01T13:00:00</dateTime>
      <dateTime>2000-01-01T19:00:00</dateTime>
    </Stamp>
  </ScheduledTime>
</ArrayOfScheduledTime>'

SELECT N.v.value('.' , 'VARCHAR(100)')B 
FROM @xDailyConfig.nodes('/ArrayOfScheduledTime/ScheduledTime/Stamp/dateTime')N(v)

/*
2000-01-01T09:00:00
2000-01-01T13:00:00
2000-01-01T19:00:00
*/

DECLARE @handel int;
EXEC sp_xml_preparedocument @handel output, @xDailyConfig
SELECT * from OPENXML(@handel,'/ArrayOfScheduledTime/ScheduledTime/Stamp/dateTime',3)
WITH(dateTime varchar(50) '.[1]') 

EXEC sp_xml_removedocument @handel

/*
2000-01-01T09:00:00
2000-01-01T13:00:00
2000-01-01T19:00:00
*/

 

--  统计每个RecurrenceType对其对应的dateTime的个数 

declare @x xml
    
 select @x='<ArrayOfScheduledTime>
   <ScheduledTime>
     <RecurrenceType>EverySaturday</RecurrenceType>
     <Stamp>
       <dateTime>2000-01-01T07:00:00</dateTime>
       <dateTime>2000-01-01T08:00:00</dateTime>
     </Stamp>
   </ScheduledTime>
   <ScheduledTime>
     <RecurrenceType>EveryWednesday</RecurrenceType>
     <Stamp>
       <dateTime>2000-01-01T09:00:00</dateTime>
     </Stamp>
   </ScheduledTime>
   <ScheduledTime>
     <RecurrenceType>EveryFriday</RecurrenceType>
     <Stamp>
       <dateTime>2000-01-01T09:00:00</dateTime>
       <dateTime>2000-01-01T09:20:00</dateTime>
       <dateTime>2000-01-01T09:40:00</dateTime>
     </Stamp>
   </ScheduledTime>
   <ScheduledTime>
     <RecurrenceType>EverySunday</RecurrenceType>
     <Stamp>
       <dateTime>2000-01-01T09:00:00</dateTime>
     </Stamp>
   </ScheduledTime>
 </ArrayOfScheduledTime>'


SELECT T2.RecurrenceType,COUNT(T3.[dateTime]) [Count]
FROM
(	SELECT CONVERT(XML,N.v.query('.'))C1 
	FROM @x.nodes('/ArrayOfScheduledTime/ScheduledTime')N(v))T1
	OUTER APPLY(
		SELECT M.v.value('.','VARCHAR(100)')RecurrenceType 
		FROM T1.C1.nodes('//RecurrenceType') M(v)
	)T2
	OUTER APPLY(
		SELECT L.v.value('.','VARCHAR(100)')[dateTime] 
		FROM T1.C1.nodes('//dateTime') L(v)
	)T3
GROUP BY T2.RecurrenceType
/*
RecurrenceType       Count
-------------------- -----------
EverySaturday        2
EveryWednesday       1
EveryFriday          3
EverySunday          1
*/

SELECT N.v.query('RecurrenceType').value('.','VARCHAR(20)') RecurrenceType,
       N.v.query('count(Stamp//dateTime)').value('.','int') [Count]
FROM @x.nodes('/ArrayOfScheduledTime/ScheduledTime')N(v)
/*
RecurrenceType       Count
-------------------- -----------
EverySaturday        2
EveryWednesday       1
EveryFriday          3
EverySunday          1
*/
 


其它样例:

       declare @x xml=
	'<ArrayOfGuid>
		  <guid>754350a3-228e-4981-a430-a5f62af9b936</guid>
		  <guid>792f9404-6330-4302-999a-3ec36e9e1275</guid>
		</ArrayOfGuid>'
   
    -- get count
   	SELECT  TOP 1 N.v.query('count(//guid)').value('.','varchar(100)') [COUNT]
	FROM @x.nodes('/ArrayOfGuid/guid')N(v)

	-- get each guidValue
	SELECT N.v.value('.','VARCHAR(100)') guidValue
		--N.v.query('count(//guid)').value('.','VARCHAR(100)') [Count]
	FROM @x.nodes('/ArrayOfGuid/guid')N(v)

	/* result

	COUNT
	----------------------------------------------------------------------------------------------------
	2

	(1 行受影响)

	guidValue
	----------------------------------------------------------------------------------------------------
	754350a3-228e-4981-a430-a5f62af9b936
	792f9404-6330-4302-999a-3ec36e9e1275

	(2 行受影响)
	*/

other sample 2:


  declare @x xml
  ='<Audits OperatorKey="77de120a-7704-49b1-8980-8f1e9ad65edd">
  <AuditItem SourceName="PatientProfile" SourceIdentity="77de120a-7704-49b1-8980-8f1e9ad65edd">
    <DataXml>
      <PatientProfile>
        <Key p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" />
        <CreatedStamp>2015-07-28T03:18:46.843Z</CreatedStamp>
        <LastUpdatedStamp>2015-07-28T03:18:46.844Z</LastUpdatedStamp>
        <State>Normal</State>
        <UserKey>77de120a-7704-49b1-8980-8f1e9ad65edd</UserKey>
        <FirstName>zhang</FirstName>
        <LastName>andy</LastName>
        <MiddleName />
        <Gender>Male</Gender>
        <Birthday p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" />
        <AvatarCode />
        <AvatarKey p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" />
        <ProgramKeyList />
        <Overall />
        <BirthLocation />
        <Residence />
        <BodyHeight>0</BodyHeight>
        <MainDisease />
        <OtherDisease>
          <TimeBasedDiseaseItemOfDiseaseName>
            <Time>1</Time>
            <DiseaseItem>
              <Key>15aabe2b-73af-426d-b668-b93fb84035ec</Key>
              <CreatedStamp>2015-07-28T03:41:01.1260093Z</CreatedStamp>
              <LastUpdatedStamp>2015-07-28T03:41:01.1260093Z</LastUpdatedStamp>
              <State>Normal</State>
              <ThirdPartyIdentity>542cb968-f806-46ee-9e9d-8ba5bdbf8da7</ThirdPartyIdentity>
              <IsMain>false</IsMain>
              <Name />
              <CultureInfo>zh-cn</CultureInfo>
            </DiseaseItem>
          </TimeBasedDiseaseItemOfDiseaseName>
        </OtherDisease>
        <Symptoms />
        <MedicalHistory />
        <Infections />
        <Allergies />
        <FamilyHistory />
        <SmokingHistory />
        <DrinkingHistory />
        <EmergencyContact />
        <SurgeryHistory>
          <SurgeryHistory>
            <Key p4:nil="true" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" />
            <CreatedStamp>2015-07-28T03:18:46.848Z</CreatedStamp>
            <LastUpdatedStamp>2015-07-28T03:18:46.849Z</LastUpdatedStamp>
            <State>Normal</State>
            <SurgeryDate>2015-02-01T03:18:46.849Z</SurgeryDate>
            <Surgery>
              <Key>b259b887-ac76-4f01-a03d-afa1a8e238a2</Key>
              <CreatedStamp>2015-07-28T03:18:41.685Z</CreatedStamp>
              <LastUpdatedStamp>2015-07-28T03:18:41.688Z</LastUpdatedStamp>
              <State>Normal</State>
              <NameCN>肝移植</NameCN>
              <NameEN>Liver Transplant</NameEN>
            </Surgery>
          </SurgeryHistory>
        </SurgeryHistory>
        <PatientLocation>
          <Key p3:nil="true" xmlns:p3="http://www.w3.org/2001/XMLSchema-instance" />
          <CreatedStamp>2015-07-28T03:18:46.845Z</CreatedStamp>
          <LastUpdatedStamp>2015-07-28T03:18:46.847Z</LastUpdatedStamp>
          <State>Normal</State>
          <UserKey>77de120a-7704-49b1-8980-8f1e9ad65edd</UserKey>
          <GeographyTierKey_Province>d4538110-24fc-4edd-9320-1f6b62b192fa</GeographyTierKey_Province>
          <GeographyTierKey_City>a92c824c-512e-4d8b-812d-448b95546662</GeographyTierKey_City>
          <Province>吉林省</Province>
          <City>白城市</City>
        </PatientLocation>
        <DrugRemind>
          <DrugRemind>
            <Key>db9808b9-4957-47c6-99c1-92ca97548392</Key>
            <CreatedStamp>2015-07-28T03:13:18.753Z</CreatedStamp>
            <LastUpdatedStamp>2015-07-28T03:13:18.753Z</LastUpdatedStamp>
            <State>Normal</State>
            <TargetUserKey>77de120a-7704-49b1-8980-8f1e9ad65edd</TargetUserKey>
            <DrugKey>00000000-0000-0000-0000-000000000000</DrugKey>
            <BrandKey>00000000-0000-0000-0000-000000000000</BrandKey>
            <DrugName>新山地明/普乐可复</DrugName>
            <BrandName>新山地明/普乐可复</BrandName>
            <BoxSize>0</BoxSize>
            <Unit>;2-6 mg</Unit>
            <Amount>1</Amount>
            <DoseStrength>0</DoseStrength>
            <DoseStrengthWithUnit>2-6 mg</DoseStrengthWithUnit>
            <DoseTimePin>
              <Recurrence>EveryHour</Recurrence>
              <ReferenceStamps>
                <dateTime>2000-01-01T00:00:00Z</dateTime>
                <dateTime>2000-01-01T12:00:00Z</dateTime>
              </ReferenceStamps>
              <StartStamp>2014-08-22T00:00:00Z</StartStamp>
              <EndStamp p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
            </DoseTimePin>
            <CreatedBy>77de120a-7704-49b1-8980-8f1e9ad65edd</CreatedBy>
          </DrugRemind>
          <DrugRemind>
            <Key>bb49ed53-b16f-4caa-882e-82dcdf8ce991</Key>
            <CreatedStamp>2015-07-28T03:13:18.747Z</CreatedStamp>
            <LastUpdatedStamp>2015-07-28T03:13:18.747Z</LastUpdatedStamp>
            <State>Normal</State>
            <TargetUserKey>77de120a-7704-49b1-8980-8f1e9ad65edd</TargetUserKey>
            <DrugKey>00000000-0000-0000-0000-000000000000</DrugKey>
            <BrandKey>00000000-0000-0000-0000-000000000000</BrandKey>
            <DrugName>米芙/骁悉</DrugName>
            <BrandName>米芙/骁悉</BrandName>
            <BoxSize>0</BoxSize>
            <Unit>;1080 mg</Unit>
            <Amount>1</Amount>
            <DoseStrength>0</DoseStrength>
            <DoseStrengthWithUnit>1080 mg</DoseStrengthWithUnit>
            <DoseTimePin>
              <Recurrence>EveryHour</Recurrence>
              <ReferenceStamps>
                <dateTime>2000-01-01T00:00:00Z</dateTime>
                <dateTime>2000-01-01T12:00:00Z</dateTime>
              </ReferenceStamps>
              <StartStamp>2014-08-22T00:00:00Z</StartStamp>
              <EndStamp p5:nil="true" xmlns:p5="http://www.w3.org/2001/XMLSchema-instance" />
            </DoseTimePin>
            <CreatedBy>77de120a-7704-49b1-8980-8f1e9ad65edd</CreatedBy>
          </DrugRemind>
        </DrugRemind>
      </PatientProfile>
    </DataXml>
  </AuditItem>
</Audits>'

 --declare @GeographyTierKey_Province varchar(100)
	--	select  @GeographyTierKey_Province=@x.value('(Audits/AuditItem/DataXml/PatientProfile/PatientLocation/GeographyTierKey_Province)[0]','varchar(100)')
		 
	--	 print @GeographyTierKey_Province

	declare @GeographyTierKey_Province varchar(100)
		--select  @GeographyTierKey_Province=@x.value('(Audits/AuditItem/DataXml/PatientProfile/PatientLocation/GeographyTierKey_Province)[0]','varchar(100)')
		 
		 --print @GeographyTierKey_Province
	 select @GeographyTierKey_Province=(SELECT top 1 N.v.value('.','VARCHAR(100)') guidValue  
    --N.v.query('count(//guid)').value('.','VARCHAR(100)') [Count]  
FROM @x.nodes('Audits/AuditItem/DataXml/PatientProfile/PatientLocation/GeographyTierKey_Province')N(v) )

   select @GeographyTierKey_Province
   -- d4538110-24fc-4edd-9320-1f6b62b192fa
    


 

来源:

SQL特殊语句的笔记

http://www.2cto.com/database/201205/133329.html


说明,使用 openxml后,一定要记得用 sp_xml_removedocument 释放xml document资源。


(结束)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值