MS SQL-如何使用XML节点(字段中包含的XML)连接到表

MS SQL-如何使用XML节点(字段中包含的XML)连接到表,sql,sql-server,join,Sql,Sql Server,Join,我有一些返回一组记录的SQL代码,包括一个交叉应用程序,它从一个联接表中分离XML并查询XML。这很好,但是我需要查看基表中的记录,即使XML中没有匹配项 例如,以下代码可以工作,但仅当XML中的WHERE子句与下面的WHERE子句匹配时才会显示记录(眼科检查、HgA1c和PCDate>3/1/2014) 我需要的是显示我的遭遇\u ExamDetails/EcounterInfoView数据,即使没有XML匹配。通常,当这些只是表时,我使用联接(如下面的左联接): 您将希望使用外部应用程序而不

我有一些返回一组记录的SQL代码,包括一个交叉应用程序,它从一个联接表中分离XML并查询XML。这很好,但是我需要查看基表中的记录,即使XML中没有匹配项

例如,以下代码可以工作,但仅当XML中的WHERE子句与下面的WHERE子句匹配时才会显示记录(眼科检查、HgA1c和PCDate>3/1/2014)

我需要的是显示我的遭遇\u ExamDetails/EcounterInfoView数据,即使没有XML匹配。通常,当这些只是表时,我使用联接(如下面的左联接):


您将希望使用外部应用程序而不是交叉应用程序

这应该可以做到:

 select 
  EncounterInfoView.AppointmentDate,
  pref2.value('(PCare/text())[1]', 'varchar(50)') as PCARE,
  TRY_PARSE(pref2.value('(PCDate/text())[1]', 'varchar(50)') AS date) as PCDate,
  pref2.value('(PCareComm/text())[1]', 'varchar(50)') as PCareComm

from
  Encounter_ExamDetails 
  left join dbo.Encounter_PhysicalExam on dbo.Encounter_PhysicalExam.FormID = dbo.Encounter_ExamDetails.FormID
  left join EncounterInfoView on EncounterInfoView.EncounterID = dbo.Encounter_PhysicalExam.EncounterID
  left join [dbo].[Encounter_History] on   [dbo].[Encounter_History].EncounterID = dbo.Encounter_PhysicalExam.EncounterID

OUTER APPLY
    HIST_PCARE.nodes('/PCareH/PCareList/PCareItem') AS PCARE(pref2)

WHERE
  (EncounterInfoView.AppointmentDate BETWEEN ('2014-03-01') and ('2014-04-01'))
    and
       (
            (pref2.value('(PCare/text())[1]', 'varchar(50)') = 'Eye Exam'
            or  pref2.value('(PCare/text())[1]', 'varchar(50)') = 'HgA1c'
            or pref2.value('(PCare/text())[1]', 'varchar(50)') IS NULL)
            and (TRY_PARSE(pref2.value('(PCDate/text())[1]', 'varchar(50)') AS date) >= '2014-03-01'
            or TRY_PARSE(pref2.value('(PCDate/text())[1]', 'varchar(50)') AS date) is null)
        )

看起来这很有帮助,因为我现在得到的是空值记录。但是,当我的try_parse date>3/1时,它仍然在删除记录。我相信这是因为这是在where子句中,所以它减少了选择。这就像我需要一种“外部应用”的方法,其中where子句只在该外部应用上,而不是在整个选择上。我已经更新了我的答案,我相信您现在应该会得到一些结果。TRY_解析可能返回null,这导致结果被排除。尝试一下,让我知道它是否适合你。这会增加一些记录,但只是一些。我认为问题是,is null将发现记录的存在,但值为null。我实际上需要它做的是,即使pref2 XML(PCare/PCDate)中没有记录,也要从基表返回记录(Conference_ExamDetails)。我最终使用临时表,拉入XML,然后从基表中选择记录并连接到临时表。
 select 
  EncounterInfoView.AppointmentDate,
  pref2.value('(PCare/text())[1]', 'varchar(50)') as PCARE,
  TRY_PARSE(pref2.value('(PCDate/text())[1]', 'varchar(50)') AS date) as PCDate,
  pref2.value('(PCareComm/text())[1]', 'varchar(50)') as PCareComm

from
  Encounter_ExamDetails 
  left join dbo.Encounter_PhysicalExam on dbo.Encounter_PhysicalExam.FormID = dbo.Encounter_ExamDetails.FormID
  left join EncounterInfoView on EncounterInfoView.EncounterID = dbo.Encounter_PhysicalExam.EncounterID
  left join [dbo].[Encounter_History] on   [dbo].[Encounter_History].EncounterID = dbo.Encounter_PhysicalExam.EncounterID

OUTER APPLY
    HIST_PCARE.nodes('/PCareH/PCareList/PCareItem') AS PCARE(pref2)

WHERE
  (EncounterInfoView.AppointmentDate BETWEEN ('2014-03-01') and ('2014-04-01'))
    and
       (
            (pref2.value('(PCare/text())[1]', 'varchar(50)') = 'Eye Exam'
            or  pref2.value('(PCare/text())[1]', 'varchar(50)') = 'HgA1c'
            or pref2.value('(PCare/text())[1]', 'varchar(50)') IS NULL)
            and (TRY_PARSE(pref2.value('(PCDate/text())[1]', 'varchar(50)') AS date) >= '2014-03-01'
            or TRY_PARSE(pref2.value('(PCDate/text())[1]', 'varchar(50)') AS date) is null)
        )