2010-06-16 28 views

回答

1

在SQL Server 2005及更高版本上,如果您需要快速進行少量行的臨時導入,則還可以使用此XQuery代碼而不是大型SQL XML Bulkload。它不是那麼快,但你不會有創建模式等來使用它:

DECLARE @Input XML 
SET @Input = '<ROOT> 
       <Customers> 
        <CustomerId>1111</CustomerId><CompanyName>Sean Chai</CompanyName><City>NY</City> 
        .... 
       </Customers> 
       </ROOT>' 

INSERT INTO dbo.Customer(CustomerId, CompanyName, City) 
    SELECT 
     InputData.Customer.value('(CustomerId)[1]', 'int') 'Customer ID', 
     InputData.Customer.value('(CompanyName)[1]', 'varchar(100)') 'Company Name', 
     InputData.Customer.value('(City)[1]', 'varchar(50)') 'City' 
    FROM 
     @Input.nodes('/ROOT/Customers') AS InputData(Customer) 

爲XML的一小塊一小塊的偉大工程,如果你需要存儲那些SQL表。

有關背景信息,請參閱聯機叢書Introduction to XQuery in SQL Server 2005

1

假設你想要閱讀的實體作爲行和它們的屬性,因爲這Microsoft Support page描述過程列數據。

你的表和XML數據必須匹配:

CREATE TABLE Customer (
    CustomerId INT PRIMARY KEY, 
    CompanyName NVARCHAR(20), 
    City NVARCHAR(20)) 

XML:

<ROOT> 
    <Customers> 
    <CustomerId>1111</CustomerId> 
    <CompanyName>Sean Chai</CompanyName> 
    <City>NY</City> 
    </Customers> 
    ... 
</ROOT> 

然後你需要創建一個架構映射文件:

<?xml version="1.0" ?> 
<Schema xmlns="urn:schemas-microsoft-com:xml-data" 
     xmlns:dt="urn:schemas-microsoft-com:xml:datatypes" 
     xmlns:sql="urn:schemas-microsoft-com:xml-sql" > 

    <ElementType name="CustomerId" dt:type="int" /> 
    <ElementType name="CompanyName" dt:type="string" /> 
    <ElementType name="City" dt:type="string" /> 

    <ElementType name="ROOT" sql:is-constant="1"> 
     <element type="Customers" /> 
    </ElementType> 

    <ElementType name="Customers" sql:relation="Customer"> 
     <element type="CustomerId" sql:field="CustomerId" /> 
     <element type="CompanyName" sql:field="CompanyName" /> 
     <element type="City"  sql:field="City" /> 
    </ElementType> 
</Schema> 

最後一個腳本(在這種情況下VBScript)加載數據:

Set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkLoad") 
objBL.ConnectionString = "provider=SQLOLEDB.1;data source=MySQLServer;database=MyDatabase;uid=MyAccount;pwd=MyPassword" 
objBL.ErrorLogFile = "c:\error.log" 
objBL.Execute "c:\customermapping.xml", "c:\customers.xml" 
Set objBL = Nothing 
+0

謝謝,但是,我們有任何查詢來做到這一點 – subash 2010-06-16 12:32:02

+0

@subash - 沒有一個「查詢」,你「運行」xml文件對映射文件,它會導入數據。這是你必須遵循的過程。 – ChrisF 2010-06-16 12:32:48