2016-09-29 3 views
2

Это часть гораздо более крупной хранимой процедуры, но прежде чем я смогу перейти, я должен сначала разобрать XML, извлечь атрибуты и вставить их в таблицу temp. Затем я буду использовать эту таблицу для выполнения функций позже.Подзапрос возвратил более 1 значения со вставкой из XML

Когда я пытаюсь вставить в таблицу temp, я получаю «Подзапрос возвращает более 1 значения». Если мой фиктивный 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 ABvalue ('@ 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 Insert into ... values ​​(SELECT ... FROM ...)] (http://stackoverflow.com/questions/25969/sql-insert-into-values-select-from) – har07

+0

@ZLK, что есть точно, что я закончил делать, я видел ответ marc_s перед вашим. Я использовал ключевое слово «values» только на основе предыдущего опыта. Спасибо за ваш вклад! – 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

Смежные вопросы