none
SQL 2000 DB restore 到SQL 2008後無法 Export 到別的SQL2008 DB RRS feed

  • 一般討論

  • 各位前輩:
       當我將SQL 2000 backup的 file restore 到 SQL 2008後,
    一般的Select, Insert , update都正常,但是我發現某些 Table(不只一個),
    無法靠 Export Data的方式,匯出到另一台同是 SQL 2008的DB上.
    會出現以下的Error.
    "連結伺服器 '(null)' 的 OLE DB 提供者 'STREAM' 傳回無效的資料給資料行 '[!BulkInsert].[Fieldname]'。".

    Ps. Fieldname 代表的是該 Table 中的某個欄位名稱.


    後來發現只有建2台 SQL 2008 =>A和B, 將SQL 2000的DB Restore到 Server B上,
    再用 Link Server 的方式連回 Server A,先在 Server A 重新建好 DB和 Table,
    並用 insert into linkserverB.DB.owner.Table select * from serverA.DB.owner.table
    的方式寫入,這樣才能將Server A的 Talbe 正常的Export 到別的DB上.


    我也有試過將 2K版本的資料全部匯出成 TEXT或 Excel 檔,再 Import進去,但Import時就會出現以上的錯誤了,
    資料根本匯不進去.即使我先在 SQL 2008建好 Table也一樣.

    但是用第一個Link Server 的方式來轉換資料非常的慢,我光一個Table(200萬筆左右的資料)就要轉 18分鐘,
    整台 Server 轉完要花費的時間完全的超過我可以停機的時間.

    請問有前輩碰過這樣的問題嗎?是否有其他的方式可以轉換資料呢?
    謝謝各位!

    我的環境如下:
     1. SQL 2000
         Win2003 with SP2 + SQL 2K With SP4
     2. SQL 2008
         Win2003 R2 X64 with SP2 + SQL 2008
    • 已編輯 小圓頭 2009年10月9日 上午 09:25
    • 已變更類型 Alex ChuoModerator 2009年10月31日 上午 11:20 提問者未有後續回應
    2009年10月9日 上午 08:57

所有回覆

  • hi
    確認資料來源有無違反目的相關限制(確定你在mapping過程是否正確)
    '[!BulkInsert].[Fieldname]'。"=>有這column嗎???
    http://www.dotblogs.com.tw/ricochen/Default.aspx
    2009年10月9日 上午 09:15
    版主
  • Hi, Ricoisme,
         謝謝您的回答!!

        Fieldname 代表的是我的Column Name, 我確認過有,(不好意思,沒標清楚)
    Mapping 過程也確認過. 這些都是正確的

       我有試著寫程式一筆一筆的資料塞,找出過出問題的資料,
    看起來非常的普通,我如果將該筆資料刪除,會過,但是可能 down在其他筆.
    出問題的欄位的Datatype 有 character , decimal, 也有過 datetime.


       我也試過,將整個Table update成同樣的資料,只有key值不一樣,
    還是會出現 Error.

    問題在我要將 SQL 2K 版的資料轉換到 SQL 2008上,Backup&Restore的方式雖然上去了,
    但是資料庫似乎怪怪的,Restore上去的資料 做一般的程式行為都沒問題,
    偏偏只有 Export 到別台 SQL 2008上有問題,即使目的地先不開 Table 也一樣.

    目的Server 不開 Table 直接Export 過去,應該就完全沒有 mapping 或資料格式不合的可能了,
    但是不論我怎麼做都弄不上去,非得透過另一台SQL2008 做 Link server 才行.

    這樣讓我懷疑 2K 版的 DB 在 Restore到 SQL 2008時會有格式上的問題.

    但是輾轉這樣一筆一筆的塞資料,時間太長,才想問問是否有其他的方法可以轉換資料呢?
    謝謝您!

     

    2009年10月9日 上午 09:24
  • 嘗試將該欄位設定null
    ALTER TABLE yourtable WITH CHECK ADD CONSTRAINT.......

    { CHECK | NOCHECK } CONSTRAINT

    指定 constraint_name 為已啟用或已停用。這個選項只能搭配 FOREIGN KEY 和 CHECK 條件約束來使用。當指定 NOCHECK 時,會停用條件約束,且不會依照條件約束條件來驗證未來資料行的插入或更新作業。不能停用 DEFAULT、PRIMARY KEY 及 UNIQUE 條件約束。

    參考
    http://technet.microsoft.com/zh-tw/library/ms190273.aspx



    其他轉換資料方法可以使用SSIS2008
    http://www.dotblogs.com.tw/ricochen/Default.aspx
    2009年10月9日 上午 10:09
    版主
  • 各位前輩:
       當我將SQL 2000 backup的 file restore 到 SQL 2008後,
    一般的Select, Insert , update都正常,但是我發現某些 Table(不只一個),
    無法靠 Export Data的方式,匯出到另一台同是 SQL 2008的DB上.
    會出現以下的Error.
    "連結伺服器 '(null)' 的 OLE DB 提供者 'STREAM' 傳回無效的資料給資料行 '[!BulkInsert].[Fieldname]'。".

    Ps. Fieldname 代表的是該 Table 中的某個欄位名稱.


    後來發現只有建2台 SQL 2008 =>A和B, 將SQL 2000的DB Restore到 Server B上,
    再用 Link Server 的方式連回 Server A,先在 Server A 重新建好 DB和 Table,
    並用 insert into linkserverB.DB.owner.Table select * from serverA.DB.owner.table
    的方式寫入,這樣才能將Server A的 Talbe 正常的Export 到別的DB上.


    我也有試過將 2K版本的資料全部匯出成 TEXT或 Excel 檔,再 Import進去,但Import時就會出現以上的錯誤了,
    資料根本匯不進去.即使我先在 SQL 2008建好 Table也一樣.

    但是用第一個Link Server 的方式來轉換資料非常的慢,我光一個Table(200萬筆左右的資料)就要轉 18分鐘,
    整台 Server 轉完要花費的時間完全的超過我可以停機的時間.

    請問有前輩碰過這樣的問題嗎?是否有其他的方式可以轉換資料呢?
    謝謝各位!

    我的環境如下:
     1. SQL 2000
         Win2003 with SP2 + SQL 2K With SP4
     2. SQL 2008
         Win2003 R2 X64 with SP2 + SQL 2008
    Did you change database's compatibility level after restoring on sql2k8?
    2009年10月9日 下午 12:46
  • Hi, Ricoisme ,
        謝謝您的回答,將欄位更改為 Null 並停用 Constraint後,
    還是發生一樣的錯誤.

        我有試過用 SSIS,但也還是發生一樣的錯誤.
    我是先用Restore 的方式到一台 SQL 2008,
    再用 SSIS作 Data Export 到第二台 SQL 2008,
    或是可以用其他的方法嗎?
    謝謝您!
                                            Patmis
    2009年10月12日 上午 12:55
  • Hi Rmiao,
         謝謝您的提醒.
     我在 Restore 後已經有更改 Level 為 100了.
    Export 到另一台Server的 DB Level一樣為 100.
    是否還有其他的問題需要注意呢? 謝謝您.
    2009年10月12日 上午 12:58
  • Run 'select @@servername' on involved servers, ensure don't get null result. If get null, run 'sp_addserver instance_name, local' on that server then restart sql.
    2009年10月12日 上午 01:04
  • Hi Rmiao,
               我做了 'Select @@servername' 的指令了,
    傳回的 Server Name 是正確的. 
     
              請問確認 Server Name是因為 DB Restore
    可能會改變 Server Name 嗎? 我只有 Restore 自行建立的 DB,
    並沒有 restore master DB . 這樣也會發生嗎?
    謝謝您~
    2009年10月12日 上午 01:16
  • Restoring db will not change server name, but error you posted mentions null name. 
    2009年10月12日 上午 02:23
  • Hi, Rmiao
      原來如此~, 謝謝您的說明.
    我繼續找找看, 看有沒有其他縮短時程的方法,
    謝謝您.
    2009年10月12日 上午 02:28
  • 我在SQL Server 2000,使用匯出精靈匯到SQL Server 2008,
    也是會出現"連結伺服器 '(null)' 的 OLE DB 提供者 'STREAM' 傳回無效的資料給資料行 '[!BulkInsert].[Fieldname]'。
    --
    我反覆試了一下,先把有問題的資料表用SELECT INTO到新資料表,
    再用DELETE指令把原資料表的資料記錄全部刪除,
    接下來開啟新資料表,選擇全部資料列複製,再貼到原來的資料表裡面,
    不知道是什麼原理,匯出精靈就莫名奇妙可以匯到SQL Server 2008了。
    ---
    不過我的資料記錄很少,沒有超過10萬筆。

    2012年3月26日 上午 02:32
  • Hi, Orazio0810,

        感謝您的回覆, 這個方式我也試過, 

    的確原本有些有問題的資料就可以過了,

    但還是有部分的資料無法順利轉換過去.

    最後不得已,  我架設了另一台SQL 2008 Server ,

    將原本SQL2000 的資料用程式一筆一筆的塞過去,

    然後再轉到正式的Server 上. 

    這是不得已的方法, 非常費時, 因為轉換資料在即, 

    所以只好用時間換取資料了!!

    還是非常謝謝您提供的經驗與資料!!

    希望對大家能有所幫助!!                                  

    2012年3月26日 上午 02:43