2016-03-25 4 views
2

Добрый день.Вставить XML в SQL Server

В настоящее время я сделал небольшую демонстрацию с XML на сервере SQl.

У меня есть таблица с именем: tb_xml_demo(ID, Name, Descr)

И каждый раз, когда я вставляю в эту таблицу. ID колонки, как это:

001, 002, 003 .... 

Это моя процедура

alter proc sp_xml_demo_cud 
@p_xml xml 
as 
begin 
    declare @dochandle int; 

    exec sp_xml_preparedocument @dochandle output,@p_xml; 

    insert into tb_xml_demo(id, name, descr) 
     select 
      (select 
       format(isnull(convert(int, max(id)), 0) + 1, '000') 
      from tb_xml_demo) id, 
      name, 
      descr 
     from 
      OPENXML(@dochandle,'/root/item',2) 
     with 
      (name nvarchar(50), 
      descr nvarchar(50), 
      crud varchar(1) 
      ) 
    end; 

И это мой XML:

exec sp_xml_demo_cud 
    '<root> 
     <item> 
      <name>9876543</name> 
      <descr>1sdfsd</descr> 
     </item> 
     <item> 
      <name>333</name> 
      <descr>333</descr> 
     </item> 
    </root>'; 

И это результат после выполнения процедуры:

id Name  Descr 
    001 9876543 1sdfsd 
    001 333  333 

Пожалуйста, помогите мне.

Большое спасибо.

+1

помочь вам с чем? Здесь нет никаких вопросов! – HoneyBadger

+1

Вопрос не совсем понятен - но я думаю, его проблема в том, что оба его идентификатора выходят «001». Это происходит из-за конвертирования (int, max (id)) + 1 бит ... конечно, который назначит одинаковый идентификатор для каждой строки в партии, и даже если вы вставляете строки по отдельности, это действительно ужасный способ делать вещи , Просто используйте идентификатор int и позвольте серверу генерировать ваши идентификаторы! – beercohol

+3

Боковое примечание: вы не должны ** использовать префикс '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_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

ответ

3

Я рекомендовал бы это сделать:

  • создать таблицу с ID INT IDENTITY(1,1) столбца, чтобы SQL Server обрабатывать поколение уникального идентификатора значения
  • добавить вычисленного колонку (я назвал его PaddedID), что использует системный, действительный ID для отображения с ведущими нулями
  • разобрать XML со встроенной встроенной функциональностью XQuery (вместо устаревшего OPENXML материала, который известен для памяти l eaks)

Это дает мне этот код:

-- create your table 
CREATE TABLE tb_xml_demo 
     (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
     PaddedID AS RIGHT('0000' + CAST(ID AS VARCHAR(4)), 4) PERSISTED, 
     Name VARCHAR(50), 
     Descr VARCHAR(100) 
     ) 

-- declare your INPUT XML document 
DECLARE @input XML = '<root> 
     <item> 
      <name>9876543</name> 
      <descr>1sdfsd</descr> 
     </item> 
     <item> 
      <name>333</name> 
      <descr>333</descr> 
     </item> 
    </root>' 

-- parse the XML using XQuery and insert the results into that newly created table 
INSERT INTO dbo.tb_xml_demo 
     (Name, Descr) 
    SELECT 
     ItemName = xc.value('(name)[1]', 'varchar(50)'), 
     ItemDescr = xc.value('(descr)[1]', 'varchar(100)') 
    FROM 
     @input.nodes('/root/item') AS XT(XC) 

-- select the values from the table  
SELECT * FROM dbo.tb_xml_demo 

и это приводит к выходу:

enter image description here

+0

В другом случае, если ID столбец имеет сложную структуру, как показано ниже: --date: 2016/03/26 DO201603260001 DO201603260002 DO201603260003 DO201603260004 Как я могу генерировать эти данные столбца, когда я использую вставку команды из XML. Пожалуйста, помогите мне снова. Большое вам спасибо. –

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