3

こんにちは、次のようなデータを含む XML ファイルを使用して、SQL Server データベースにデータを挿入しようとしています。OPENXML で属性マッピングを行うことができました。XML を属性ではなく要素として渡そうとすると、エラーが発生します。 null挿入について。

以下は私のXMLファイルです(属性を含む)

<NewDataSet>
  <SampleDataTable id="20" Name="as" Address="aaa" Email="aa" Mobile="123" />
</NewDataSet>

上記の形式を使用して成功しました。以下の形式を使用すると、エラーが発生します

<Customer>
  <Id>20</Id>
  <Name>Cn</Name>
  <Address>Pa</Address>
  <Email>bnso@gmail.com</Email>
  <Mobile>12345513213</Mobile>
</Customer>

これは SQL での私の openXML です

 insert into @tempTable
    select * from openxml (@xmlHandle,'ROOT/Customer/',1)
    with (Cust_id int '@id',
          Customer_Name varchar(30) '@Name',
          Address varchar(30) '@Address',
          Email_id varchar(30) '@Email',
          Mobile_no bigint '@Mobile'
          )

    Insert into Test.dbo.tblCustomers (Cust_id,Customer_Name,Address,Email,Mobile_No) (select * from @tempTable)

助けてください

4

2 に答える 2

2

これは、データを属性としてフェッチしようとしているが、xml データが要素内にあるためです。これを試して:

insert into @tempTable
select *
from openxml (@xmlHandle,'ROOT/Customer/',1)
with (Cust_id int '@id',
      Customer_Name varchar(30) 'Name[1]',
      Address varchar(30) 'Address[1]',
      Email_id varchar(30) 'Email[1]',
      Mobile_no bigint 'Mobile[1]'
      )

または、openxml なしでこれを行うことができます。

select
    t.c.value('Name[1]', 'varchar(30)') as Name,
    t.c.value('Address[1]', 'varchar(30)') as Address,
    t.c.value('Email[1]', 'varchar(30)') as Email,
    t.c.value('Mobile[1]', 'bigint') as Mobile
from @Data.nodes('Customer') as t(c)

sql fiddle demo

于 2013-10-07T05:36:17.610 に答える
1

問題は「要素の値」と「要素の属性」です。

このページには、両方の良い例があります:

http://technet.microsoft.com/en-us/library/ms187897%28v=sql.90%29.aspx

<Customer>   
   <CustomerID>LILAS</CustomerID>
   <ContactName>Carlos Gonzlez</ContactName>
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'

-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT    *
FROM      OPENXML (@XmlDocumentHandle, '/ROOT/Customer',2)
           WITH (CustomerID  varchar(10),
                 ContactName varchar(20))
EXEC sp_xml_removedocument @XmlDocumentHandle
于 2013-10-07T05:42:03.750 に答える