从指定的路径解析XML

时间:2015-12-29 08:37:44

标签: sql sql-server xml tsql

受人尊敬的Techhie, 也许有人请帮助我。

我在xml列的表中有一个xml数据,如下所示

create table HEADER
(
FileID varchar (10),
ACES_Version VARCHAR (50),
Header_Company VARCHAR (150),
Header_SenderName VARCHAR (150),
ACES_RecordCount VARCHAR (150),
HeaderNode VARCHAR (150),
FooterNode VARCHAR (150)
)

INSERT  HEADER

SELECT 1 AS FileID 
  ,t.c.value('/ACES[1]/@version','varchar(max)') AS ACES_Version
  ,t.c.value('(/ACES/Header/Company)[1]','varchar(max)') AS Header_Company
  ,t.c.value('(/ACES/Header/SenderName)[1]','varchar(max)') AS Header_SenderName
  ,t.c.value('(/ACES/Footer/RecordCount)[1]','int') AS ACES_RecordCount
  ,t.c.query('/ACES/Header') AS HeaderNode
  ,t.c.query('/ACES/Footer') AS FooterNode
from NETCHANGESource.dbo.tblFile s
CROSS APPLY s.xmldata.nodes('/') AS t(c);   -- col is your XML column

我正在尝试存储过程,该过程解析数据并将其加载到{{1}}。  我试过像上面给出但是得到错误像

  

必须声明标量变量“@x”。

任何人都可以建议这里的错误是什么。

我试过这段代码

{{1}}

但是收到错误 Msg 257,Level 16,State 3,Line 13 不允许从数据类型xml到varchar的隐式转换。使用CONVERT函数运行此查询。

1 个答案:

答案 0 :(得分:2)

您应该使用nodes()功能:

INSERT INTO #tblFile
SELECT 1 AS FileID 
  ,t.c.value('/ACES[1]/@version','varchar(max)') AS ACES_Version
  ,t.c.value('(/ACES/Header/Company)[1]','varchar(max)') AS Header_Company
  ,t.c.value('(/ACES/Header/SenderName)[1]','varchar(max)') AS Header_SenderName
  ,t.c.value('(/ACES/Footer/RecordCount)[1]','int') AS ACES_RecordCount
  ,t.c.query('/ACES/Header') AS HeaderNode
  ,t.c.query('/ACES/Footer') AS FooterNode
from @x.nodes('/') AS t(c)

SELECT *
FROM #tblFile;

LiveDemo

如果数据在另一个表中,您可以使用CROSS APPLY

INSERT INTO tblFile   -- define column list here (FileID, ACES_Version,...)
SELECT 1 AS FileID 
      ,t.c.value('/ACES[1]/@version','varchar(max)') AS ACES_Version
      ,t.c.value('(/ACES/Header/Company)[1]','varchar(max)') AS Header_Company
      ,t.c.value('(/ACES/Header/SenderName)[1]','varchar(max)') AS Header_SenderName
      ,t.c.value('(/ACES/Footer/RecordCount)[1]','int') AS ACES_RecordCount
      ,t.c.query('/ACES/Header') AS HeaderNode
      ,t.c.query('/ACES/Footer') AS FooterNode
from NETCHANGESource.dbo.tblFile s
CROSS APPLY s.col.nodes('/') AS t(c);   -- col is your XML column

LiveDemo2