2016-03-25 15 views
2

Herkese iyi günler.SQL Server'a XML ekle

Şu anda SQl Server'da XML ile küçük bir demo hazırladım.

Ben isimde tablo vardır: tb_xml_demo(ID, Name, Descr)

Ve her seferinde bu tabloya eklediğinizde. Böyle kimliği sütunu:

001, 002, 003 .... 

Bu benim prosedür

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; 

Ve bu benim xml geçerli:

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

Ve bu işlemleri yaptıktan sonra neden olduğu:

id Name  Descr 
    001 9876543 1sdfsd 
    001 333  333 

Lütfen bana yardım edin.

Çok teşekkürler.

+1

Yardım sizi? Burada soru yok! – HoneyBadger

+1

Sorun hiç açık değil - ama bence problemi her iki kimliğinin de "001" çıkması. Bunun nedeni, dönüştürme işleminin (int, max (id)) + 1 bit ... 'i, tabanda her satır için aynı kimliği atayacak olmasıdır ve satırları tek tek ekleseniz bile gerçekten bir şeyler yapmanın gerçekten korkunç bir yoludur. . Sadece bir kimlik int kullanın ve sunucunun kimliğinizi oluşturmasına izin verin! – beercohol

+3

Yan not: saklı yordamlarınız için ** sp_' öneki kullanmamalısınız **. Microsoft [kendi kullanımı için öneki ayırmıştır (bkz. * Kayıtlı Yordamları İsme *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) ve Gelecekte bazen bir isim çatışması riskiyle karşı karşıyasınız. [Ayrıca saklı yordam performansınız için de kötüdür] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Sadece 'sp_''den kaçınmak ve önek olarak başka bir şey kullanmak ya da hiç bir önek kullanmamak en iyisidir! Farklı durumda –

cevap

3

bunu yaparken öneriyoruz:

  • SQL Server benzersiz kimlik nesil
  • bir bilgisayarlı sütun eklemek değerleri halledeyim için ID INT IDENTITY(1,1) sütuna ile tablo oluşturmak (ı PaddedID denir) o
  • baştaki sıfırlarla görüntülenmek için sistem tarafından oluşturulan geçerli ID kullanır, yerleşik XQuery işleviyle XML'yi ayrıştırın (eski bellek için çok kullanılan eski OPENXML öğesinin yerine eaks)

Bu bana bu kodu verir:

-- 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 

ve bunun bir çıkış sonuçlanır: neyle

enter image description here

+0

, kimliği sütunu altında gibi karmaşık bir yapıya sahipse: --date: Ben XML insert komutu kullandığınızda bu sütun verilerini oluşturmak nasıl DO201603260002 DO201603260003 DO201603260004 2016/03/26 DO201603260001 . Lütfen tekrar yardım edin. Çok teşekkür ederim. –