在 SQL Server Native Client 中執行大量複製作業

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (通常縮寫為 SNAC) 已從 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除。 不建議使用 SQL Server Native Client (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 開發新的應用程式。 往後請改用新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新的 Microsoft ODBC Driver for SQL Server。 針對 SQL Server 資料庫引擎 (2012 到 2019 版) 的隨附元件 SQLNCLI,請參閱支援生命週期例外狀況

SQL Server 大量複製功能支援將大量資料傳入或傳出 SQL Server 資料表或檢視。 資料也可以藉由指定 SELECT 陳述式而向外傳送。 您可在 SQL Server 與作業系統資料檔 (例如 ASCII 檔案) 之間移動。 資料檔可能具有不同的格式;您可將格式定義為以格式檔來大量複製。 或者,也可以使用大量複製函數和方法,將資料載入程式變數,然後傳送到 SQL Server。

如需示範此功能的範例應用程式,請參閱使用 IRowsetFastLoad 大量複製資料 (OLE DB)

應用程式通常會以下列其中一種方式使用大量複製:

  • 從資料表、檢視或 Transact-SQL 陳述式的結果集大量複製到資料檔,其中資料會以與資料表或檢視相同的格式儲存。

    這稱為原生模式的資料檔案。

  • 從資料表、檢視或 Transact-SQL 陳述式的結果集大量複製到資料檔,其中儲存資料的格式會與資料表或檢視不同。

    在此情況下,會在每一個資料行儲存到資料檔中時,為其建立另一個定義特性 (資料類型、位置、長度、結束字元等) 的格式檔案。 如果所有的資料行都轉換成字元格式,則產生的檔案稱為字元模式資料檔。

  • 從資料檔大量複製到資料表或檢視。

    如有需要,可使用格式檔來判斷資料檔的配置。

  • 將資料載入程式變數,然後使用可在資料行中一次複製大量資料的大量複製函數,將資料匯入資料表或檢視。

大量複製函數所使用的資料檔不必由其他的大量複製程式建立。 任何其他的系統都可以根據大量複製定義產生資料檔案和格式檔案;之後可以將這些檔案搭配 SQL Server 大量複製程式使用,以將資料匯入至 SQL Server。 例如,您可以從試算表將資料匯出至 Tab 鍵分隔檔案、建置描述 Tab 鍵分隔檔案的格式檔案,然後使用大量複製程式將資料快速匯入至 SQL Server。 大量複製所產生的資料檔也可以匯入至其他應用程式。 例如,您可以使用大量複製函數,將資料從資料表或檢視匯出至 Tab 鍵分隔檔案,然後再將該檔案載入至試算表。

程式設計人員在撰寫使用大量複製函數的應用程式時,應該遵照大量複製良好效能的一般規則。 如需 SQL Server 中大量複製作業支援的詳細資訊,請參閱資料的大量匯入及匯出 (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::CommitIRowsetFastLoad::InsertRow 方法。

針對 IRowsetFastLoad 啟用工作階段

取用者會藉由將 SQL Server Native Client OLE DB 提供者特定的數據源屬性設定為 SSPROP_ENABLEFASTLOAD VARIANT_TRUE,以通知 SQL Server Native Client OLE DB 提供者需要大量複製。 在數據源上設定 屬性之後,取用者會建立 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 會將資料列版本設定用於觸發程序,並將資料列版本儲存在 tempdb 的版本存放區中。 因此,即使啟用了觸發程序,也可以使用記錄最佳化。 在觸發程序啟用的情況下,您可能需要先擴充 tempdb 的大小,然後才能大量匯入具有大量資料列的批次。

使用以檔案為基礎的大量複製作業

SQL Server Native Client OLE DB 提供者會實作 IBCPSession 介面,以公開對 SQL Server 檔案型大量複製作業的支援。 IBCPSession 介面會實作 IBCPSession::BCPColFmtIBCPSession::BCPColumnsIBCPSession::BCPControlIBCPSession::BCPDoneIBCPSession::BCPExec、IBCPSession::BCPInit、IBCPSession::BCPReadFmt 和 IBCPSession::BCPWriteFmt 方法。

SQL Server Native Client ODBC Driver

SQL Server Native Client ODBC 驅動程式會維護屬於舊版 SQL Server ODBC 驅動程式之大量複製作業的相同支援。 如需使用 SQL Server Native Client ODBC 驅動程式進行大量複製作業的詳細資訊,請參閱 執行大量複製作業 (ODBC)

另請參閱

SQL Server Native Client 功能
資料來源屬性 (OLE DB)
資料的大量匯入及匯出 (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)
優化大容量導入效能