2016-02-22 6 views
1

Я пытаюсь вставить значения «DocumentFields» из XML в SQL Server 2008, но не повезло.Вставить XML-данные в SQL Server

Не могли бы вы помочь мне в этом? Ниже приведен XML и хранимая процедура.

CREATE PROCEDURE [dbo].[SP_Test] 
    (@xmlData As XML) 
AS 
BEGIN 
    DECLARE @idoc int 

    SET @xmlData='<?xml version="1.0" encoding="UTF-8"?> 
    <ImportSession> 
    <Documents> 
     <Document DocumentClassName="RDOCCLASS" Processed="0" Priority="2"> 
     <DocumentFields> 
     <DocumentField Name="DocumentID" Value="419" /> 
     <DocumentField Name="MessageID" Value="apap-12w-asqwe" /> 
     <DocumentField Name="AccountName" Value="John Thomas" /> 
     <DocumentField Name="AccountNumber" Value="1234567890" /> 
     <DocumentField Name="Contact" Value="00012736782345" /> 
     </DocumentFields> 
     </Document> 
    </Documents> 
    </ImportSession>' 

    EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlData; 

    INSERT INTO dbo.[Account]([DocumentID], [MessageID], [AccountName], [AccountNumber], [Contact]) 
     SELECT * 
     FROM OPENXML(@idoc,/ImportSession/Documents/Document/DocumentFields',1) 
     WITH (DocumentID varchar(20),MessageID varchar(30), 
     AccountName varchar(20),AccountNumber varchar(20), 
     Contact varchar(20) 
     ); 

    EXEC sp_xml_removedocument @xmlData; 
END 

Благодаря Арш

+1

не повезло ... подробнее пожалуйста. Каким образом это не работает? Получение ошибки? Если да, включите в свой вопрос сообщение об ошибке. –

+1

Боковое примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+0

Hi Arsh, Пожалуйста, помните о том, что большинство профессионалов, дающих ответы на SO, жаждут очков репутации. [Пожалуйста, прочтите это: кто-то-ответы] (http://stackoverflow.com/help/someone-answers). Было бы неплохо также взглянуть на ваши старые вопросы. Спасибо! – Shnugo

ответ

3

OPENXML абсолютно устарела. Это, как вы получите данные из переменной XML в современном стиле:

DECLARE @xmlData XML='<?xml version="1.0" encoding="UTF-8"?> 
    <ImportSession> 
    <Documents> 
     <Document DocumentClassName="RDOCCLASS" Processed="0" Priority="2"> 
     <DocumentFields> 
     <DocumentField Name="DocumentID" Value="419" /> 
     <DocumentField Name="MessageID" Value="apap-12w-asqwe" /> 
     <DocumentField Name="AccountName" Value="John Thomas" /> 
     <DocumentField Name="AccountNumber" Value="1234567890" /> 
     <DocumentField Name="Contact" Value="00012736782345" /> 
     </DocumentFields> 
     </Document> 
    </Documents> 
    </ImportSession>'; 

SELECT Doc.value('(DocumentFields/DocumentField[@Name="DocumentID"]/@Value)[1]','int') AS DocumentID 
     ,Doc.value('(DocumentFields/DocumentField[@Name="MessageID"]/@Value)[1]','varchar(max)') AS MessageID 
     ,Doc.value('(DocumentFields/DocumentField[@Name="AccountName"]/@Value)[1]','varchar(max)') AS AccountName 
     ,Doc.value('(DocumentFields/DocumentField[@Name="AccountNumber"]/@Value)[1]','varchar(max)') AS AccountNumber 
     ,Doc.value('(DocumentFields/DocumentField[@Name="Contact"]/@Value)[1]','varchar(max)') AS Contact 
FROM @xmlData.nodes('/ImportSession/Documents/Document') AS One(Doc) 

Так что ваш SP должен быть таким:

Create PROCEDURE [dbo].[SP_Test] 
(
    @xmlData As XML 
) 

As 
BEGIN 



INSERT INTO dbo.[Account]([DocumentID], 
          [MessageID], 
          [AccountName], 
          [AccountNumber], 
          [Contact] 
         ) 

SELECT Doc.value('(DocumentFields/DocumentField[@Name="DocumentID"]/@Value)[1]','int') AS DocumentID 
     ,Doc.value('(DocumentFields/DocumentField[@Name="MessageID"]/@Value)[1]','varchar(max)') AS MessageID 
     ,Doc.value('(DocumentFields/DocumentField[@Name="AccountName"]/@Value)[1]','varchar(max)') AS AccountName 
     ,Doc.value('(DocumentFields/DocumentField[@Name="AccountNumber"]/@Value)[1]','varchar(max)') AS AccountNumber 
     ,Doc.value('(DocumentFields/DocumentField[@Name="Contact"]/@Value)[1]','varchar(max)') AS Contact 
FROM @xmlData.nodes('/ImportSession/Documents/Document') AS One(Doc); 
END 
+0

Ах, никакой поворот не нужен, как вы это делаете. =) –

+0

Если я буду возиться с моим ответом, я, вероятно, появлюсь с твоим =). Я удалил это. Я пытался получить там «документ», но я не хочу возиться с таблицей чисел. Ваш более элегантный. Мне еще многое предстоит узнать ;-) –

+0

@TT. Вы потеряли мой верхний уровень, удалив это. Бедный ты! Я просто поместил голосование на ваш другой ответ, чтобы убрать у вас урон :-) – Shnugo

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