【问题标题】:Extracting Information from XML in SQL Server after performing a join执行联接后从 SQL Server 中的 XML 中提取信息
【发布时间】:2019-01-28 15:02:10
【问题描述】:

我通过以下代码创建了一个 SQL 表,其中包含我需要能够提取的信息的列 UserDefinedXML

SELECT A.ExternalID, A.UserDefinedXML, A.ServiceSiteUid, A.LastModifiedDate, A.PersonUid,
       B.FirstName, B.LastName, B.PersonUid,
       C.Name
  FROM Patient A
  INNER JOIN Person B ON B.PersonUid = A.PersonUid
  INNER JOIN ListServiceSite C ON C.ServiceSiteUid = A.ServiceSiteUid
  WHERE A.UserDefinedXML IS NOT NULL
  ORDER By LastModifiedDate

我一直在通过 R 中的许多 gsub 提取它,但这是低效的,而且不是最好的方法,我敢肯定。 XML格式如下

<data>
  <LOA>
    <NotMedNecessaryInsCompany ControlType="PrmTextBox" Value="" Label="" />
    <DicontinuedDate ControlType="FindDateBox" Value="" Label="" Display="false" />
    <ReceivedDate ControlType="FindDateBox" Value="" Label="" Display="false" />
    <SentDate ControlType="FindDateBox" Value="" Label="" Display="false" />
    <ReasonDiscontinued ControlType="PrmTextBox" Value="" Label="" />
    <NoOONBenefitsInsCompany ControlType="PrmTextBox" Value="" Label="" />
    <InsuranceStatus ControlType="PrmGroupBox" Label="" Value="" />
    <OtherReasonDenied ControlType="PrmTextBox" Value="" Label="" />
    <FacilityRefused ControlType="PrmCheckBox" Value="false" Label="Facility Refused" />
    <ReasonDenied ControlType="PrmCheckBox" Value="false" Label="Other" />
  </LOA>
  <Forms>
    <POReceivedDate ControlType="FindDateBox" Value="" Label="" Display="false" />
    <InformedConsentReceivedDate ControlType="FindDateBox" Value="" Label="" Display="false" />
    <AuthorizationToTreatReceivedDate ControlType="FindDateBox" Value="" Label="" Display="false" />
  </Forms>
  <Skin_Sheet>
    <SkinSheet ControlType="PrmGroupBox" Label="No" Checked="PrmRadioButton1" Value="" />
  </Skin_Sheet>
</data>

目前,我只对SkinSheet 标题下的最后几行中选择“是”还是“否”感兴趣。最终,我需要能够访问此字符串中的所有字段。不幸的是,我对 SQL 非常缺乏经验,并且在工作中被投入其中,所以我正在努力学习。

【问题讨论】:

  • 你看过 XQUERY 吗? xml Data Type Methods
  • 在不同的注释Bad habits to kick : using table aliases like (a, b, c) or (t1, t2, t3)。使用像ABC 这样的别名只会让事情变得更加困难,尤其是当您以不同的顺序在不同的查询中引用相同的对象时。您很可能会遇到每个对象都有不同别名的查询,但在您打开的这些 3/4 查询中引用了相同的 3/4 对象。让事情变得非常混乱,不仅仅是你,还有其他必须阅读你的 SQL 的人。

标签: sql sql-server xml tsql


【解决方案1】:

假设UserDefinedXML是XML数据类型,只需使用value函数:

SELECT A.UserDefinedXML.value('(//SkinSheet/@Label)[1]', 'varchar(100)'), other, columns
FROM ...

【讨论】:

    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多