SQL批量複製命令的六個陷阱

來源:互聯網
上載者:User

批量複製工具(BCP)是SQL Server主要的命令列工具之一,使用非常方便, 它也是SQL Server匯入匯出海量資料的方式。但是DBA應注意BCP存在幾項限制, 本文作者通過自身經曆總結了一些主要的問題表現。

1、沒有對UTF-8的支 持

SQL Server有對Unicode的本地支援,使用過nvarchar和ntext欄位類型 的任何人都知道。它通過映射每個字元為雙位元組實體來內部處理Unicode。如果你 只是處理SQL Server執行個體之間的資料,那麼不會有任何問題,因為它們都以相同 的方式儲存。

不過,如果你試圖使用BCP從把Unicode匯出為UTF-8的資料 來源匯入資料,那事情就有點複雜了。UTF-8是Unicode的一種子變體,專門設計 支援與八位ASCII文本的向後相容,所以預設使用八位ASCII編碼的網頁、電子郵 件和其它格式可以用於儲存Unicode資料。

如果你從UTF-8源匯出資料,不 要指望對這些資料使用BCP;它一直不支援UTF-8。你必須考慮資料問題,以完整雙 位元組Unicode匯出使資料形成可接受格式。具有諷刺意味的是,另一個普通的編碼 可以通過“-C”開關(ISO 1252,ANSI/微軟公司Windows)被BCP接受。不過,就 整體而言,你最好把資料匯出為雙位元組Unicode,以保持對BCP的最大相容性,尤 其是如果你處理的資料可能包含與ASCII不相容的字元。

2、注意匯出的行 順序

使用BCP通過查詢匯出的資料對於匯出順序遵守相同的規則,會應用 於任何其它情況的查詢。換句話說,如果你的查詢沒有明確的“ORDER BY”從句 ,你獲得的資料看起來就是完全任意的順序。它通常是基於隱含索引中的順序形 成的,但是我已經學會甚至連經驗法則也不相信了——尤其是如果該查詢在多個 表之間執行“JOIN”或者一些其它彙總函式。

資料是按什麼順序匯出的通 常並不重要,但是資料以什麼順序匯入是非常關鍵的。如果你使用的資料庫是後 來匯入行的正確性決定於早先存在的行,而且你是大量匯入資料的話,那麼匯出 的順序就很重要,你需要相應地建立你的BCP語句。這一點似乎顯而易見,但是我 經常驚訝有那麼多人,甚至包括一些資深的SQL Server專家都沒有意識到這一點 。

3、從BCP啟用的預存程序不能接收參數

如果你使用帶有參數的 預存程序,作為BCP動作Transact-SQL(T-SQL)語句的一部分,幾乎可以肯定它 不能用,而且會在命令列拋出函數順序錯誤。

當T-SQL語句傳遞給BCP時, 它將被使用“SET FMTONLY ON”機制進行分析,來判斷結果集的柱狀格式。這意 味著動態構造語句(比如帶參數的預存程序)將不能正確分析,而且也不能在BCP 下編譯。

如果你想解決這個問題,有幾種方法可以選擇:

建立不帶任何參數的預存程序,用問號啟用預存程序並傳入需要的參數(可能 通過資料來源而不是命令列接收參數)。

用sqlcmd替代BCP。

MSDN部落格中提到了一個處理技巧,需要使用稱為“openrowset”的技巧。如果 你通過“OPENROWSET ”函數運行“SELECT”,你可以以臨時方式傳遞一個T-SQL 陳述式,從而解決調用帶參數預存程序的限制。然而,這種處理技巧也有局限:例 如,與語句串連時不應該使用,因為運行會對資料庫造成消極變化,而且該語句 可能需要運行不止一次。

4、匯入時要注意表定義

當你使用BCP從一個SQL Server源匯出資料, 並匯入到另一個SQL Server時,你匯出時的列定義和匯入時的列定義必須相匹配 。這也包括諸如NULL或者NOT NULL這類定義,在目標表缺少它們會引起靜默資料 損壞。

5、在目標資料庫上的觸發器不能被BCP觸發

不管什麼時候 運行匯入操作,BCP的本地行為在目標資料庫上都會禁用觸發器。因為BCP匯入操 作通常很大,如果按預設啟用觸發器的話,匯入操作會很混亂。因此,你需要在 BCP上使用命令選項“-h FIRE_TRIGGERS”,這樣觸發器才會被觸發。

要 注意,當選項啟用時,觸發器會為每個大量操作運行一次,——也就是說,每次 你運行BCP時執行一次。另外還要注意,在SQL Server 2005和以後的版本中,觸 發器使用了“行版本”,在匯入操作時用tempdb來儲存行版本資訊。如果你的 tempdb不能容納觸發器產生的大量資料湧入,該操作將異常終止。

6、BCP 不能給本地附加檔案輸出

如果你使用BCP匯出資料到檔案,該檔案必須是 新建立的。你不能選擇現存檔案,並把匯出結果追加到檔案。幸運的是,解決辦 法並不困難,您可以簡單地匯出到任何多個檔案,然後使用COPY命令來整合這些 結果。命令如下:

COPY export1.dat + export2.dat export.dat

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.