2016-03-25 29 views
2

いい午後。SQLをSQL Serverに挿入

現在、私はSQl ServerでXMLを使用した小さなデモを行っています。

私は名前を持つテーブルを持っている:tb_xml_demo(ID, Name, Descr)

そして、私はこのテーブルに挿入するたび。

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 
このようなID列

私を助けてください。

ありがとうございます。

+1

は何のお手伝いをしますか?ここに質問はありません! – HoneyBadger

+1

質問は全く明確ではありませんが、彼の問題は両方のIDが "001"から出てくることです。これはconvert(int、max(id))+ 1ビットのためです...もちろん、バッチ内のすべての行に同じIDを割り当てます。行を個別に挿入しても、それは本当に恐ろしい方法です。アイデンティティintを使用して、サーバーにIDを生成させてください! – beercohol

+3

サイドノート:ストアドプロシージャのプレフィックス 'sp_'を**使用しないでください**。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](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

私はこれを行うことをお勧めします:

  • は、SQL Serverが計算列を追加し、固有ID値
  • の生成を処理できるようにID INT IDENTITY(1,1)列を使用してテーブルを作成します(私はPaddedIDそれを呼ばれる)ことシステムで生成された有効なIDを使用して先行ゼロで表示する
  • メモリをよく知らない従来のOPENXMLの代わりに、組み込みのネイティブXQuery機能を使用してXMLを解析します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:私はXMLからの挿入コマンドを使用するときに、私は、この列のデータを生成することができますどのようにDO201603260002 DO201603260003 DO201603260004 2016年3月26日 DO201603260001 を。 もう一度お手伝いください。 ありがとうございます。 –

関連する問題