【问题标题】:Extracting data from XML Array using SQL使用 SQL 从 XML 数组中提取数据
【发布时间】:2019-01-21 08:00:44
【问题描述】:

我有以下 XML,并希望从中提取 PrimaryTeams、SecondaryTeams 和 OverflowTeams 数组,并将它们以逗号分隔或每行一个。

我有以下 xml:

declare @xml xml 
set @xml = '<SimpleStrategy xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Synthesys.Switch.ACD">
  <Id>00000000-0000-0000-0000-000000000000</Id>
  <Name>Default</Name>
  <AcceptedCLIs xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <d2p1:string>07811353995</d2p1:string>
  </AcceptedCLIs>
  <ActiveHours>
    <FridayEnd />
    <FridayStart />
    <MondayEnd />
    <MondayStart />
    <SaturdayEnd />
    <SaturdayStart />
    <SundayEnd />
    <SundayStart />
    <ThursdayEnd />
    <ThursdayStart />
    <TuesdayEnd />
    <TuesdayStart />
    <UseIndividualWeekDays>false</UseIndividualWeekDays>
    <WednesdayEnd />
    <WednesdayStart />
    <WeekdayEnd />
    <WeekdayStart />
  </ActiveHours>
  <AgentUserName />
  <AllowRouteDuringFinalMessage>false</AllowRouteDuringFinalMessage>
  <CRMPrefix />
  <DirectDDIMessage />
  <DirectDDIPassThrough>false</DirectDDIPassThrough>
  <EmergencyBusyBack>false</EmergencyBusyBack>
  <EmergencyDivertNumber />
  <EmergencyWavFile />
  <FinallyDivertNumber />
  <FinallyDrop>true</FinallyDrop>
  <FinallyMessageFile />
  <MaximumQueueLength>0</MaximumQueueLength>
  <MaximumQueueWait>0</MaximumQueueWait>
  <MinimumRingTime>4000</MinimumRingTime>
  <MusicOnHold />
  <MusicWhileWaiting />
  <NumberOfRings>2</NumberOfRings>
  <OutOfHoursDivertNumber />
  <OutOfHoursDrop>true</OutOfHoursDrop>
  <OutOfHoursMessage />
  <OverflowMessage />
  <OverflowTeams xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
  <PrimaryTeams xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <d2p1:int>3</d2p1:int>
    <d2p1:int>1</d2p1:int>
  </PrimaryTeams>
  <Priority>1</Priority>
  <RecordAgent>false</RecordAgent>
  <RecordCall>true</RecordCall>
  <RecordCustomer>false</RecordCustomer>
  <RegulatoryMessage>Default.wav</RegulatoryMessage>
  <SecondaryOverflowMessage />
  <SecondaryTeams xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
  <SendBusyIfQueueTooLong>false</SendBusyIfQueueTooLong>
  <SendBusyIfWaitTooLong>false</SendBusyIfWaitTooLong>
  <TimeInOverflow>-1</TimeInOverflow>
  <TimeWithDirectDDI>20000</TimeWithDirectDDI>
  <TimeWithPrimaryTeams>-1</TimeWithPrimaryTeams>
  <TimeWithSecondaryTeams>20000</TimeWithSecondaryTeams>
  <UseDirectDDI>false</UseDirectDDI>
  <UsePAM>false</UsePAM>
  <UseSecondaryTeams>false</UseSecondaryTeams>
  <WrapTime>40000</WrapTime>
</SimpleStrategy>'

然后我创建了以下 SQL 语句来尝试提取团队

;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' as i, 'http://schemas.microsoft.com/2003/10/Serialization/Arrays' as d2p1,
                     DEFAULT 'http://schemas.datacontract.org/2004/07/Synthesys.Switch.ACD')

SELECT @xml,
    @xml.value('(/SimpleStrategy/Name)[1]', 'varchar(255)'),
    @xml.value('(/SimpleStrategy/PrimaryTeams)[1]', 'int') as PrimaryTeams,
    @xml.value('(/SimpleStrategy/SecondaryTeams)[1]', 'int') as SecondaryTeams,
    @xml.value('(/SimpleStrategy/OverflowTeams)[1]', 'int') as OverflowTeams

但我得到的只是将 TeamID 串联在一起。

,PrimaryTeams,SecondaryTeams,OverflowTeams

默认,31,0,0

有什么想法吗?

谢谢

马特

【问题讨论】:

  • 不清楚您希望最终结果集是什么样子(每种情况下团队的数量不同),但作为提示,请尝试SELECT n.i.value('.', 'int') FROM @xml.nodes('/SimpleStrategy/PrimaryTeams/d2p1:int') as n(i)
  • 非常感谢,这是完美的,我可以用它来获得我需要的东西,:)

标签: sql sql-server xml tsql


【解决方案1】:

您的 XML 在 &lt;PrimaryTeams&gt; 中显示了两个团队 ID,而其他两个团队节点都是空的……您没有告诉我们任何有关其中预期计数的信息。但是,以下方法将返回一种 entity-value-pairs,其中包含所有团队的所有 ID。希望这是您需要的:

;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' as i, 'http://schemas.microsoft.com/2003/10/Serialization/Arrays' as d2p1,
                     DEFAULT 'http://schemas.datacontract.org/2004/07/Synthesys.Switch.ACD')

SELECT 'Name' AS Caption
      ,1 AS RowInx
      ,@xml.value('(/SimpleStrategy/Name)[1]', 'varchar(255)') AS Content
UNION ALL 
SELECT 'Primary Team'
      ,ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
      ,t.value('.','varchar(255)')
FROM @xml.nodes('/SimpleStrategy/PrimaryTeams/d2p1:int') A(t)
UNION ALL 
SELECT 'Secondary Team'
      ,ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
      ,t.value('.','varchar(255)')
FROM @xml.nodes('/SimpleStrategy/SecondaryTeams/d2p1:int') A(t)
UNION ALL 
SELECT 'Overflow-Team'
      ,ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
      ,t.value('.','varchar(255)')
FROM @xml.nodes('/SimpleStrategy/OverflowTeams/d2p1:int') A(t);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 2012-11-16
    • 1970-01-01
    • 2014-01-04
    • 2018-03-02
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多