将XML列转换为SQL表

时间:2017-08-17 17:29:56

标签: sql-server xml tsql xpath xquery

我有这个问题,我不知道如何解决。

首先,我已将XML数据导入到名为Sheet1到列MENUXML的SQL表中。 XML中的示例是:

<DADOSNOTAALTA titulo="Externa E6020731-INT NEFROLOGIA (27-10-2006*1:07:17 PM)" mostra="1" liga="novaalta.aspx?x=DADOSNOTAALTA" versao="1" data="27-10-2006" hora="1:09:05 PM" autor="CH" publica="" episodio="6020731" especialidade="SCI" interna="0">
    <DTALTA titulo="Data da Alta" valor="27-10-2006, 12:59" />
    <DESTINOT titulo="" valor="Consulta externa" />
    <DESTINOD titulo="Obs:" valor="HGSA 31/10/2006" />
    <MTADM titulo="" valor="DISFUNÇÃO ENXERTO RENAL&#xD;&#xA;CREATININA 1,4 -2,2 AGORA 1,7" />
    <RESUMO titulo="" valor="BIOPSIA RENAL - SINAIS DE NTA, SEM SINAIS NA MICROSC. ÓPTICA DE REJEIÇÃO AGUDA&#xD;&#xA; C4D POSITIVO PERI-TUBULAR" />
    <DIAGNO titulo="" valor="Transplante com rim de dador cadáver COM DISFUNÇÃO TRANSITÓRIA.&#xD;&#xA;Transplante pâncreas&#xD;&#xA;" />
    <TRATAM titulo="" valor="Tacrolimus 5 + 4 mg, 12/12 horas&#xD;&#xA;Sirolimus 2mg dia&#xD;&#xA;Prednisolona  20mg, manhã&#xD;&#xA;Valganciclovir 450mg&#xD;&#xA;Omeprazol 20 mg dia&#xD;&#xA;Bactrim                            1 compr./dia&#xD;&#xA;Epo B 6000 / 2 vezes /semana SC.&#xD;&#xA;Ácido acetilsalicílico 100mg dias alternados&#xD;&#xA;Carbonato de cálcio 2 gr,  /dia&#xD;&#xA;" />
    <PROG titulo="" valor="" />
    <PROPI titulo="" valor="" />
    <MONIT titulo="" valor="FUNÇÃO RENAL E PANCREATICA E NIVEIS FÁRMACOS" />
    <ORIENT titulo="" valor="cONSULTA EXTERNA TR RIM-PANCREAS" />
</DADOSNOTAALTA>

然后我创建了一个名为Dados的新表,其中包含以下列:

dados_nota, destino_tratamento, destino_doente, 
metodo_admissao, resumo, diagnostico, tratamento,
prog, propi, monitorizacao, orientacao

这些都存在于XML中。

Table from where i want to extract the XML

Table where i want to save the transformed data

现在的问题是,我不知道如何让SQL Server直接从列中读取XML并将其传输到新数据库中的列。

亲切的问候

1 个答案:

答案 0 :(得分:3)

你的问题可能很清楚,但根本不清楚......

  

......他们[列]都出现在XML ...

嗯,有人猜测,但这取决于你:-D

试试这个:

DECLARE @xml XML=
N'<DADOSNOTAALTA titulo="Externa E6020731-INT NEFROLOGIA (27-10-2006*1:07:17 PM)" mostra="1" liga="novaalta.aspx?x=DADOSNOTAALTA" versao="1" data="27-10-2006" hora="1:09:05 PM" autor="CH" publica="" episodio="6020731" especialidade="SCI" interna="0">
  <DTALTA titulo="Data da Alta" valor="27-10-2006, 12:59" />
  <DESTINOT titulo="" valor="Consulta externa" />
  <DESTINOD titulo="Obs:" valor="HGSA 31/10/2006" />
  <MTADM titulo="" valor="DISFUNÇÃO ENXERTO RENAL&#xD;&#xA;CREATININA 1,4 -2,2 AGORA 1,7" />
  <RESUMO titulo="" valor="BIOPSIA RENAL - SINAIS DE NTA, SEM SINAIS NA MICROSC. ÓPTICA DE REJEIÇÃO AGUDA&#xD;&#xA;                          C4D POSITIVO PERI-TUBULAR" />
  <DIAGNO titulo="" valor="Transplante com rim de dador cadáver COM DISFUNÇÃO TRANSITÓRIA.&#xD;&#xA;Transplante pâncreas&#xD;&#xA;" />
  <TRATAM titulo="" valor="Tacrolimus                 5 + 4 mg, 12/12 horas&#xD;&#xA;Sirolimus                         2mg dia&#xD;&#xA;Prednisolona              20mg, manhã&#xD;&#xA;Valganciclovir                  450mg&#xD;&#xA;Omeprazol                       20 mg dia&#xD;&#xA;Bactrim                            1 compr./dia&#xD;&#xA;Epo B                               6000 / 2 vezes /semana SC.&#xD;&#xA;Ácido acetilsalicílico         100mg dias alternados&#xD;&#xA;Carbonato de cálcio          2 gr,  /dia&#xD;&#xA;" />
  <PROG titulo="" valor="" />
  <PROPI titulo="" valor="" />
  <MONIT titulo="" valor="FUNÇÃO RENAL E PANCREATICA E NIVEIS FÁRMACOS" />
  <ORIENT titulo="" valor="cONSULTA EXTERNA TR RIM-PANCREAS" />
</DADOSNOTAALTA>';


SELECT @xml.value(N'/DADOSNOTAALTA[1]/@titulo',N'nvarchar(max)') AS dadosnota_titulo
      ,@xml.value(N'/DADOSNOTAALTA[1]/@mostra',N'int') AS dadosnota_mostra --some int value
      --ommited more attributes
      ,@xml.value(N'/DADOSNOTAALTA[1]/DTALTA[1]/@titulo',N'nvarchar(max)') AS dtalta_titulo
      ,@xml.value(N'/DADOSNOTAALTA[1]/DTALTA[1]/@valor',N'nvarchar(max)') AS dtalta_valor --bad datetime format, should be ISO8601...
      --The rest should work the same...

更新:从表中读取

试试这个:

SELECT t.OtherColumn --add needed columns of your table
      ,t.YourXmlColumn.value(N'/DADOSNOTAALTA[1]/@titulo',N'nvarchar(max)') AS dadosnota_titulo
      ,t.YourXmlColumn.value(N'/DADOSNOTAALTA[1]/@mostra',N'int') AS dadosnota_mostra --some int value
      --ommited more attributes
      ,t.YourXmlColumn.value(N'/DADOSNOTAALTA[1]/DTALTA[1]/@titulo',N'nvarchar(max)') AS dtalta_titulo
      ,t.YourXmlColumn.value(N'/DADOSNOTAALTA[1]/DTALTA[1]/@valor',N'nvarchar(max)') AS dtalta_valor --bad datetime format, should be ISO8601...
      --The rest should work the same...
FROM YourTable AS t;