執行大量複製作業
SQL Server 大量複製功能支援將大量資料傳送進出 SQL Server 資料表或檢視。資料也可以藉由指定 SELECT 陳述式而向外傳送。您可在 SQL Server 和作業系統資料檔 (例如 ASCII 檔) 之間移動。資料檔可能具有不同的格式;您可將格式定義為以格式檔來大量複製。或者,您也可以使用大量複製函數和方法,將資料載入程式變數,然後傳送到 SQL Server。
CodePlex 提供的範例應用程式即可示範此功能;如需詳細資訊,請參閱<SQL Server Database Engine 範例>。應用程式通常透過下列其中一種方式使用大量複製:
從資料表、檢視或 Transact-SQL 陳述式的結果集大量複製到資料檔,其中資料會以與資料表或檢視相同的格式儲存。
這稱為原生模式的資料檔案。
從資料表、檢視或 Transact-SQL 陳述式的結果集大量複製到資料檔,其中儲存資料的格式會與資料表或檢視不同。
在此情況下,會在每一個資料行儲存到資料檔中時,為其建立另一個定義特性 (資料類型、位置、長度、結束字元等) 的格式檔案。如果所有的資料行都轉換成字元格式,則產生的檔案稱為字元模式資料檔。
從資料檔大量複製到資料表或檢視。
如有需要,可使用格式檔來判斷資料檔的配置。
將資料載入程式變數,然後使用可在資料行中一次複製大量資料的大量複製函數,將資料匯入資料表或檢視。
大量複製函數所使用的資料檔不必由其他的大量複製程式建立。任何其他的系統都可以根據大量複製定義產生資料檔和格式檔;之後可以將這些檔案搭配 SQL Server 大量複製程式使用,以將資料匯入至 SQL Server。例如,您可以從試算表將資料匯出至 Tab 鍵分隔檔案、建立描述 Tab 鍵分隔檔案的格式檔,然後使用大量複製程式將資料快速匯入至 SQL Server。大量複製所產生的資料檔也可以匯入至其他應用程式。例如,您可以使用大量複製函數,將資料從資料表或檢視匯出至 Tab 鍵分隔檔案,然後再將該檔案載入至試算表。
[!附註]
從 SQL Server 2005 開始,當您使用 bcp 公用程式時,伺服器會在資料截斷發生時報告錯誤。SQL Server 2000 和較早版本只會傳回警告。如此忽略警告的現有應用程式就可能發生問題。您可藉由下列方法來避免這些問題:確保輸出資料具有正確的值且不會截斷,或者繼續使用 SQL Server 2000 版的 bcp。
程式設計人員在撰寫使用大量複製函數的應用程式時,應該遵照大量複製良好效能的一般規則。如需有關 SQL Server 中大量複製作業支援的詳細資訊,請參閱<關於大量匯入和大量匯出作業>。
限制事項
CLR 使用者定義型別 (UDT) 必須繫結為二進位資料。即使格式檔指定 SQLCHAR 做為目標 UDT 資料行的資料類型,BCP 公用程式也會將該資料視為二進位。
請勿將 SET FMTONLY OFF 用於大量複製作業。SET FMTONLY OFF 可能會導致大量複製作業失敗或提供未預期的結果。
SQL Server Native Client OLE DB 提供者
SQL Server Native Client OLE DB 提供者會實作兩個方法,以使用 SQL Server 資料庫執行大量複製作業。第一個方法涉及使用 IRowsetFastLoad 介面進行以記憶體為基礎的大量複製作業;第二個方法則涉及使用 IBCPSession 介面進行以檔案為基礎的大量複製作業。
使用以記憶體為基礎的大量複製作業
SQL Server Native Client OLE DB 提供者實作 IRowsetFastLoad 介面,以公開對 SQL Server 以記憶體為基礎之大量複製作業的支援。IRowsetFastLoad 介面會實作 IRowsetFastLoad::Commit 和 IRowsetFastLoad::InsertRow 方法。
針對 IRowsetFastLoad 啟用工作階段
取用者會將其大量複製的需求通知 SQL Server Native Client OLE DB 提供者,方法是將 SQL Server Native Client OLE DB 提供者特定的資料來源屬性 SSPROP_ENABLEFASTLOAD 設定為 VARIANT_TRUE。在資料來源上設定該屬性後,取用者會建立 SQL Server Native Client OLE DB 提供者工作階段。新的工作階段可以讓取用者存取 IRowsetFastLoad 介面。
[!附註]
如果使用 IDataInitialize 介面來初始化資料來源,則必須在 IOpenRowset::OpenRowset 方法的 rgPropertySets 參數中設定 SSPROP_IRowsetFastLoad 屬性,否則對 OpenRowset 方法的呼叫將傳回 E_NOINTERFACE。
針對大量複製而啟用工作階段,會限制 SQL Server Native Client OLE DB 提供者對該工作階段上介面的支援。啟用大量複製功能的工作階段只會公開下列介面:
IDBSchemaRowset
IGetDataSource
IOpenRowset
ISupportErrorInfo
ITransactionJoin
若要停止建立啟用大量複製功能的資料列集,並導致 SQL Server Native Client OLE DB 提供者工作階段還原為標準處理,請將 SSPROP_ENABLEFASTLOAD 重設為 VARIANT_FALSE。
IRowsetFastLoad Rowsets
SQL Server Native Client OLE DB 提供者大量複製資料列集是唯寫的,但會公開介面讓取用者得以判斷 SQL Server 資料表的結構。下列介面會公開於啟用大量複製功能的 SQL Server Native Client OLE DB 提供者資料列集:
IAccessor
IColumnsInfo
IColumnsRowset
IConvertType
IRowsetFastLoad
IRowsetInfo
ISupportErrorInfo
提供者特定的屬性 SSPROP_FASTLOADOPTIONS、SSPROP_FASTLOADKEEPNULLS 和 SSPROP_FASTLOADKEEPIDENTITY 可控制 SQL Server Native Client OLE DB 提供者大量複製資料列集的行為。這些屬性是指定於 rgPropertySetsIOpenRowset 參數成員的 rgProperties 成員中。
屬性識別碼 |
說明 |
---|---|
SSPROP_FASTLOADKEEPIDENTITY |
資料行:否 R/W:讀取/寫入 類型:VT_BOOL 預設值:VARIANT_FALSE 描述:維護取用者所提供的識別值。 VARIANT_FALSE:SQL Server 資料表中識別資料行的值是由 SQL Server 產生。SQL Server Native Client OLE DB 提供者會忽略為資料行所繫結的任何值。 VARIANT_TRUE:取用者會繫結為 SQL Server 識別資料行提供值的存取子。在接受 NULL 的資料行上不提供識別屬性,所以取用者會在每個 IRowsetFastLoad::Insert 呼叫上提供唯一值。 |
SSPROP_FASTLOADKEEPNULLS |
資料行:否 R/W:讀取/寫入 類型:VT_BOOL 預設值:VARIANT_FALSE 描述:針對具有 DEFAULT 條件約束的資料行維護 NULL。只對接受 NULL 且套用 DEFAULT 條件約束的 SQL Server 資料行造成影響。 VARIANT_FALSE:當 SQL Server Native Client OLE DB 提供者取用者插入的資料列包含資料行要用的 NULL 時,SQL Server 會插入資料行的預設值。 VARIANT_TRUE:當 SQL Server Native Client OLE DB 提供者取用者插入的資料列包含資料行要用的 NULL 時,SQL Server 會插入 NULL 做為資料行值。 |
SSPROP_FASTLOADOPTIONS |
資料行:否 R/W:讀取/寫入 類型:VT_BSTR 預設值:無 描述:這個屬性與 bcp 公用程式的 -h "hint[,...n]" 選項相同。將資料大量複製到資料表時,可使用下列字串做為選項。 ORDER(column[ASC | DESC][,...n]):資料在資料檔中的排序次序。如果載入的資料檔是依照資料表的叢集索引來排序,將可增進大量複製的效能。 ROWS_PER_BATCH = bb:每批次的資料列數目 (記為 bb)。伺服器根據 bb 值,將大量載入最佳化。依預設,ROWS_PER_BATCH 是未知的。 KILOBYTES_PER_BATCH = cc:每批次資料的千位元組 (KB) 數目 (記為 cc)。依預設,KILOBYTES_PER_BATCH 是未知的。 TABLOCK:在大量複製作業期間必須使用資料表層級鎖定。這個選項會大幅提升效能,因為只在大量複製作業期間保留鎖定,會減少爭用資料表鎖定的情況。如果資料表沒有索引,且指定了 TABLOCK,多個用戶端便可以同時載入這份資料表。依預設,鎖定行為由資料表選項 table lock on bulk load (大量載入時鎖定資料表) 來決定。 CHECK_CONSTRAINTS:在大量複製作業期間會檢查 table_name 上的任何條件約束。依預設,會忽略條件約束。 FIRE_TRIGGER:在 SQL Server 2000 中,當觸發程序啟用時就無法進行最佳化的記錄,因為觸發程序邏輯是根據記錄檔記錄而定。在大量匯入作業期間若啟用了觸發程序,則所有的大量記錄最佳化 (包括 BU 鎖定) 都會停用。 不過從 SQL Server 2005 開始,SQL Server 會使用觸發程序的資料列版本控制,並將資料列版本儲存在 tempdb 中的版本存放區。因此,即使啟用了觸發程序,也可以使用記錄最佳化。在觸發程序啟用的情況下,您可能需要先擴充 tempdb 的大小,然後才能大量匯入具有大量資料列的批次。 |
使用以檔案為基礎的大量複製作業
SQL Server Native Client OLE DB 提供者實作 IBCPSession 介面,以公開對 SQL Server 以檔案為基礎之大量複製作業的支援。IBCPSession 介面會實作 IBCPSession::BCPColFmt、IBCPSession::BCPColumns、IBCPSession::BCPControl、IBCPSession::BCPDone、IBCPSession::BCPExec、IBCPSession::BCPInit、IBCPSession::BCPReadFmt 和 IBCPSession::BCPWriteFmt 等方法。
SQL Server Native Client ODBC 驅動程式
對於屬於舊版 SQL Server ODBC 驅動程式的大量複製作業,SQL Server Native Client ODBC 驅動程式仍維持相同的支援。如需有關使用 SQL Server Native Client ODBC 驅動程式進行大量複製作業的詳細資訊,請參閱<執行大量複製作業 (ODBC)>。