2016-09-29 50 views
2

这是一个更大的存储过程的一部分,但在开始工作之前,我必须先解析XML,提取属性并将它们插入临时表中。然后,我将在稍后使用该表执行功能。子查询从XML中插入返回多个值

当我尝试插入临时表时,我得到“子查询返回多个值”。如果我的虚拟XML包含一个节点,它工作正常,但如果我添加其他节点问题出现。

完整的SQL包括XML测试:

DECLARE @MESSAGELIST XML 
    set @MESSAGELIST = 
    '<object> 
     <Record FirstName = ''Red'' LastName = ''Shark'' Email = ''[email protected]'' Date = ''01/01/2001'' ></Record> 
     <Record FirstName = ''Jon'' LastName = ''Slow'' Email = ''[email protected]'' Date = ''01/01/2011'' ></Record>  
     <Record FirstName = ''Tyrone'' LastName = ''Lennystar'' Email = ''[email protected]'' Date = ''01/11/2011'' ></Record> 
     </object>' 

IF (OBJECT_ID('tempdb..#NHOMessagesTemp') IS NOT NULL) 
    DROP TABLE #NHOMessagesTemp 

CREATE TABLE #NHOMessagesTemp 
(
    FirstName nvarchar(50), 
    LastName nvarchar(50), 
    Email nvarchar(100), 
    MessageDate datetime 
) 

INSERT INTO #NHOMessagesTemp  
VALUES (
    (SELECT I.FirstName.value('@FirstName', 'nvarchar(50)') 
    FROM @MESSAGELIST.nodes('/object/Record') AS I(FirstName)), 
    (SELECT I.LastName.value('@LastName', 'nvarchar(50)') 
    FROM @MESSAGELIST.nodes('/object/Record') AS I(LastName)), 
    (SELECT I.Email.value('@Email', 'nvarchar(100)') 
    FROM @MESSAGELIST.nodes('/object/Record') AS I(Email)), 
    (SELECT I.[Date].value('@Date', 'datetime') 
    FROM @MESSAGELIST.nodes('/object/Record') AS I([Date])) 
    ) 

SELECT * 
FROM #NHOMessagesTemp 

我相信这个问题是我

FROM @MESSAGELIST.nodes('/object/Record') AS... 

,但我不知道通过XML如何循环并获得所有的值。

谢谢你的帮助!

+2

而不是使用'VALUES'插入,为什么不您是否使用常规选择语句?例如'SELECT Value('@ FirstName','nvarchar(50)')FirstName,ABvalue('@ LastName','nvarchar(50)')LastName,ABvalue('@ Email','nvarchar(100)' )Email,ABvalue('@ Date','datetime')[Date] FROM @ MESSAGELIST.nodes('/ object/Record')A(B)' – ZLK

+1

@ZLK应该是我认为的答案...并且这里是OP的一个相关问题:[SQL插入...值(SELECT ... FROM ...)](http://stackoverflow.com/questions/25969/sql-insert-into-values-select-from) – har07

+0

@ZLK即正是我最终做的,我看到了marc_s在你之前的回应。我基于以前的经验使用“值”关键字。谢谢您的意见! – DMcC

回答

1

试试这个代码从XML获取数据:

SELECT 
    FirstName = xc.value('@FirstName', 'varchar(50)'), 
    LastName = xc.value('@LastName', 'varchar(50)'), 
    Email = xc.value('@Email', 'varchar(50)'), 
    Date = xc.value('@Date', 'varchar(50)') 
FROM 
    @MESSAGELIST.nodes('/object/Record') AS XT(XC) 

并将其插入到你的临时表像这样:

INSERT INTO #NHOMessagesTemp(FirstName, LastName, Email, Date) 
    SELECT 
     xc.value('@FirstName', 'varchar(50)'), 
     xc.value('@LastName', 'varchar(50)'), 
     xc.value('@Email', 'varchar(50)'), 
     xc.value('@Date', 'varchar(50)') 
    FROM 
     @MESSAGELIST.nodes('/object/Record') AS XT(XC) 
+0

这工作完美!这次真是万分感谢! – DMcC