2010-04-28 52 views
3

因此,我有一個現有的ASP.NET解決方案,它使用LINQ-to-SQL將數據插入到SQL Server中(5個表,共110k條記錄)。我曾經閱讀過XML可以作爲參數傳遞給SQL Server,但我的谷歌搜索將結果直接存儲到表中。我寧願拿這個XML參數並將節點作爲記錄插入。在SQL Server中,多個插入可以被一個帶有XML參數的插入替換嗎?

這可能嗎?它是如何完成的(即如何使用XML參數在T-SQL中插入記錄,應該如何格式化XML)?

注:我正在研究其他選項,如SQL大容量複製,我知道SSIS將是一個很好的選擇。我想知道這個XML方法是否可行。

+0

總的來說,我發現XML到數據庫的轉換最好是很尷尬。它們通常是必需的,但如果您可以利用傳統技術(如分隔文件),則應該更容易實施和支持。 – 2010-04-28 13:44:47

回答

3

XML應該格式化爲正常的XML文檔。然後,您只需使用參數類型XML將其傳遞給存儲過程即可。

下面是如何進行插入的示例。在這種情況下,@p_AdditionalContactInfo是XML,它的形式如下:

<entities> 
    <entity> 
    <firstName>Joey</firstName> 
    ...   
    </entity> 
    .. more entity records 
</entities> 

這裏的T-SQL例如:

DECLARE @l_index int 

    -- parse the records from the XML 
    EXECUTE sp_xml_preparedocument @l_index OUTPUT, @p_AdditionalContactInfo 
    INSERT INTO @l_AdditionalContactInfoTbl 
      (ContactInfoID 
      , FirstName 
      , LastName 
      , ContactTypeID 
      , Title 
      , Email 
      , AddressLine1 
      , AddressLine2 
      , City 
      , State 
      , Zip 
      , MobilePhone 
      , BusinessPhone 
      , UpdateDateTime) 
     SELECT ContactInfoID 
      , FirstName 
      , LastName 
      , ContactTypeID 
      , Title 
      , Email 
      , AddressLine1 
      , AddressLine2 
      , City 
      , State 
      , Zip 
      , MobilePhone 
      , BusinessPhone 
      , UpdateDateTime 
     FROM OPENXML (@l_index, 'entities/entity', 1) 
       WITH ( ContactInfoID int   'id' 
        , FirstName  varchar(50) 'firstName' 
        , LastName  varchar(50) 'lastName' 
        , ContactTypeID int   'contactTypeId' 
        , Title   varchar(20) 'title' 
        , Email   varchar(100) 'email' 
        , AddressLine1 varchar(100) 'addressLine1' 
        , AddressLine2 varchar(100) 'addressLine2' 
        , City   varchar(50) 'city' 
        , State   varchar(2) 'state' 
        , Zip   varchar(5) 'zip' 
        , MobilePhone varchar(12) 'mobilePhone' 
        , BusinessPhone varchar(12) 'businessPhone' 
        , UpdateDateTime datetime  'updateDateTime' 
        ) 
    EXECUTE sp_xml_removedocument @l_index 
+1

非常感謝您的建議。一旦我克服了一些轉換障礙,我可以用一個10萬分鐘的上傳解決方案將11萬個單獨的插入下載到帶有20-30個插入的3分鐘上傳解決方案(由於內存不足異常,我必須在發送特定大小時發送XML) 。 – Mayo 2010-04-30 14:24:56

+0

@Mayo - 你很歡迎,我很高興聽到答案幫助你解決你的問題:) – dcp 2010-05-01 00:49:20

2

對於SQL Server 2008,真的沒有必要再爲傳統方法就像使用FOR OPENXML一樣 - 這是一個非常有用的界面,並不是很有用。

相反,使用機SQL Server XQuery來「分解」你的XML文檔轉換成塊,存儲這些:

INSERT INTO 
    dbo.YourTableName(.... list of fields.......) 
    SELECT 
     nodes.entity.value('(firstName)[1]', 'varchar(50)'), 
     nodes.entity.value('(lastName)[1]', 'varchar(50)'), 
     ........ (more columns as needed) ........... 
    FROM 
     @XmlInput.nodes('/entities/entity') AS nodes(entity) 
+1

我發現,性能明智,OPENXML可以遠快於使用.nodes和許多.value方法調用。這是我的老,但它仍然有它的位置。 – 2010-04-28 13:45:01

+0

我發現這可以工作,但相對於使用openxml處理大量數據而言,性能是悲慘的。也就是說,XQuery更具可讀性,可能適用於性能不成問題的情況。感謝您的輸入。 – Mayo 2010-04-30 14:26:38

2

是的,你可以使用SQL Server的內置XML支持。您實際上不需要使用sp_xml_preparedocument等。

I wrote up an article您可以採取的各種方法將一組記錄傳遞給sproc,以便將其保存到db(CSV vs XML vs TABLE值參數) - 看看這個,我已經給出了這些方法的例子,並對它們進行了性能比較。總之,我建議查看錶值參數 - 這是一個更自然的做法,並且提供了最好的性能。