2009-05-22 107 views
2

我很困惑SQL Server 2005如何支持導入和導出XML文件。我在想BCP是要走的路。然而,在閱讀所有文檔後,似乎沒有辦法只取一張常規表格並以XML格式導出。我問的原因是我正在與一個客戶端合作,他將以XML格式向我發送數據更新。我們都有相同結構的相同數據庫。他向我發送了示例XML文件。我假設會有一些非常簡單的方法來導入數據文件,但我無法弄清楚。任何人都可以幫助我理解如何獲取XML文件並將數據導入到現有表中?它應該很簡單,因爲XML文件是從具有完全相同結構的表生成的。如何將數據從SQL Server 2005導入和導出爲XML格式?

感謝, 科瑞

回答

0

我假設客戶端使用FOR XML包裝關係數據作爲XML文件?沒有automagic方法將xml分解回原始的關係結構,但是如果原始的xml代也使用XMLSCHEMA指令,您應該能夠以編程方式進行編程。如果客戶端包含這個,則將生成一個xml模式,該模式描述在xml實例中的哪個列(及其類型)被表示。我開始使用這種方法,但從來沒有完成過。

+0

我不確定客戶端如何創建XML文件。我正在與他聯繫並試圖瞭解他是如何創建XML文件的。我的猜測是他手工創建了它們,我將不得不編寫某種解析算法,手工一次一行地輸入數據。我希望它會更自動 - 有點像備份和恢復,但也許這不可能使用XML。 – 2009-05-22 17:22:34

2

爲什麼地球上首先使用XML作爲交換格式?

如果您在兩側都有完全相同的數據模型,純文本文件或BCP文件將完全適合您的需求,並且體積更小(即提取和加載速度更快)!

僅僅因爲XML是「最先進的」,它總是最好的選擇!當然,如果您相信您將來有一段時間需要與第三方交換數據,而第三方不共享相同的數據模型甚至是相同的平臺或界面,但情況當然不同。

1

的SQL Server 2005允許將XML數據存儲在兩個方面: - 作爲一個行集& - 行集中

  • XML列

    存儲XML數據如果您的客戶端發送你的數據作爲一個 的XML文檔,你需要將 這個數據存儲在一個數據庫表中,第一個 需要「分解」這個XML數據。 SQL 服務器允許您通過使用其相關存儲過程的OPENXML函數和 來碎化XML數據 。

粉碎XML文檔涉及以下任務:

  • 我)解析XML文檔SQL Server 2005提供了 sp_xml_preparedocument存儲過程來解析XML文檔。 此存儲過程讀取xml 文檔並使用MSXML 解析器解析它。解析的文檔是 xml文檔中的各種節點的內部樹表示,例如 元素,屬性,文本和 評論。
  • ii)從樹中檢索行集。 現在您需要從 中提取可用的xml數據。您使用 openxml函數爲此目的並從解析的數據生成內存中的行集 。語法: openxml(idoc int[in],rowpattern nvarchar[in],[flags byte[in]]) [WITH (SchemaDeclaration | TableName)]
    idoc-指定XML文檔 rowpattern-的 內部樹表示的文檔句柄指定用來識別被處理爲行 節點中的XPath 圖案。 flags- 表示應的XML數據和關係 行集之間 使用的映射,以及如何溢出柱 應該被填充。它是可選的,並且 可以具有0,1,2,3以使用默認的 映射來檢索屬性 值,以檢索元素值 並且分別檢索兩個值 。 SchemaDeclaration- 指定通過使用 列名稱,數據類型和 模式的組合返回的列的行聲明 爲 。 TableName-規定可以給予SchemaDeclaration代替 的 表名,如果需要與 所需要的模式已經存在,並且沒有 模式的表。
  • iii)存儲行集中的數據。 您可以使用由 openxml創建的行集來存儲數據,這與您將起訴任何其他 行集的方式相同。您可以將行集 數據插入 數據庫中的永久表中。
  • ⅳ)清除存儲器。你需要 釋放內存中你存儲的行集合 。爲此,您使用存儲過程的 sp_xml_removedocument

例如,下面是一個XML文檔提供的數據:

DECLARE @Doc int 
    DECLARE @XMlDoc nvarchar(1000) 
    SET @XMLDoc = N'<ROOT> 
    <Customer CustomerID="JHO1" Name="Jack"> 
     <Order OrderID="1001" CustomerID="JH01" 
      OrderDate="2009-07-04T00:00:00"> 
     <OrderDetail ProductID="11" Quantity="12"/> 
     <OrderDetail ProductID="22" Quantity="10"/> 
    </Order> 
    </Customer> 
<Customer CustomerID="SG01" Name="Steve"> 
    <Order OrderID="1002" CustomerID="SG01" 
      OrderDate="2009-08-16T00:00:00"> 
    <OrderDetail ProductID="32" Quantity="3"/> 
    </Order> 
    </Customer> 
</ROOT>' 

要在行集查看該XML數據,您需要執行以下語句:

1。創建XML文檔的內部表示EXEC sp_xml_preparedocument @Doc OUTPUT, @XMLDoc

2.執行以下查詢使用OPENXML函數存儲在一個表中的數據:

INSERT INTO CustomerDetails 
SELECT * 
FROM openxml (@Doc, '/ROOT/Customer' , 1) 
     WITH (CustomerID varchar(10), 
      Name varchar(20)) 

的數據將被顯示爲表:


CustomerID | Name | 
___________|_________| 
JH01  | Jack | 
      |   | 
SG01  | Steve | 
___________|_________| 

通過執行

EXEC sp_xml_removedocument @Doc 

您現在已經完成從內存中移除內部樹。

我認爲這種方法會幫助而不是另一個,即將XML數據存儲爲XML列。

+0

此外,您可以使用此鏈接 http://msdn2.microsoft.com/en-us/library/ms190936.aspx – Zaki 2009-06-22 22:12:05

相關問題