2013-10-07 63 views
3

您好我正嘗試插入數據到SQL Server數據庫使用XML文件,其中有一些數據如下。我能夠做OPENXML中的屬性映射。如果我嘗試通過XML作爲元素而不是屬性,我得到了關於null插入的錯誤。使用OpenXml插入SQL

以下是我的XML文件(方含屬性)

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

我成功使用上述format.If我用下面的格式我面對錯誤

<Customer> 
    <Id>20</Id> 
    <Name>Cn</Name> 
    <Address>Pa</Address> 
    <Email>[email protected]</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) 

請幫助

回答

2

這是因爲你試圖獲取數據作爲屬性,但int你的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

+0

感謝烏拉圭回合的答覆..我有1條多客戶的詳細信息,我怎麼能繼續 – Developer

+0

明白了..真正的幫助...謝謝, – Developer

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

感謝它的好鏈接... – Developer