受人尊敬的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函数运行此查询。
答案 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
强>