使用 BULK INSERT 或 OPENROWSET(BULK...) 匯入大量資料

本主題提供一個概觀,說明如何使用 Transact-SQL BULK INSERT 陳述式與 INSERT...SELECT * FROM OPENROWSET(BULK...) 陳述式,將資料檔中的資料大量匯入到 Microsoft SQL Server 資料表中。本主題也將說明有關使用 BULK INSERT 和 OPENROWSET(BULK…),以及使用這些方法從遠端資料來源大量匯入時的安全性考量。

[!附註]

當您使用 BULK INSERT 或 OPENROWSET(BULK…) 時,了解 SQL Server 2005 及之後的版本處理模擬的方式相當重要。如需詳細資訊,請參閱本主題稍後的「安全性考量」。

BULK INSERT 陳述式

BULK INSERT 會從資料檔案將資料載入資料表。此功能與 bcp 命令的 in 選項相似,但卻是由 SQL Server 處理序來讀取資料檔案。如需 BULK INSERT 語法的描述,請參閱<BULK INSERT (Transact-SQL)>。

範例

OPENROWSET(BULK…) 函數

OPENROWSET BULK 資料列集提供者可透過呼叫 OPENROWSET 函數及指定 BULK 選項加以存取。OPENROWSET(BULK…) 函數可讓您透過 OLE DB 提供者連接到遠端資料來源 (例如資料檔案),以存取遠端資料。

若要大量匯入資料,請從 INSERT 陳述式內的 SELECT…FROM 子句呼叫 OPENROWSET(BULK…)。大量匯入資料的基本語法是:

INSERT ...SELECT * FROM OPENROWSET(BULK...)

當用於 INSERT 陳述式時,OPENROWSET(BULK...) 支援資料表提示。除了一般的資料表提示 (例如 TABLOCK) 之外,BULK 子句也接受下列特定的資料表提示:IGNORE_CONSTRAINTS (僅忽略 CHECK 條件約束)、IGNORE_TRIGGERS、KEEPDEFAULTS 和 KEEPIDENTITY。如需詳細資訊,請參閱<資料表提示 (Transact-SQL)>。

如需有關 BULK 選項其他用法的詳細資訊,請參閱<OPENROWSET (Transact-SQL)>。

範例

安全性考量

如果使用者是使用 SQL Server 登入,則會使用 SQL Server 處理序帳戶的安全性設定檔。相反地,如果 SQL Server 使用者是使用 Windows 驗證登入,則該使用者只能讀取使用者帳戶可以存取的檔案,這與 SQL Server 處理序的安全性設定檔是無關的。

例如,有個使用者使用 Windows 驗證登入了 SQL Server 執行個體。如果這個使用者要用 BULK INSERT 或 OPENROWSET 從資料檔匯入資料到 SQL Server 資料表中,則使用者帳戶必須具有資料檔案的讀取權限。有了資料檔案的存取權之後,即使 SQL Server 處理序沒有權限存取檔案,使用者還是可以將檔案中的資料匯入到資料表。使用者不需要將檔案存取權限授與 SQL Server 處理序。

SQL Server 和 Microsoft Windows 可以設定為,透過轉送已驗證 Windows 使用者的認證,讓 SQL Server 執行個體連接到另一個 SQL Server 執行個體。此設置也稱為「模擬」或「委派」。當您使用 BULK INSERT 或 OPENROWSET 時,請務必了解 SQL Server 2005 及之後的版本如何處理使用者模擬的安全性。使用者模擬允許資料檔案位於和 SQL Server 處理序或使用者不同的電腦上。例如,如果位於 Computer_A 的使用者可以存取 Computer_B 上的資料檔,且已適當設定認證委派,則使用者可以連接到執行於 Computer_C 上的 SQL Server 執行個體,然後存取 Computer_B 上的資料檔,並從該檔案大量匯入資料到 Computer_C 上的資料表。如需詳細資訊,請參閱<了解模擬>。

[!附註]

SQL Server 2005 及之後的版本控制檔案存取的方式可解決 Microsoft SQL Server 2000 或舊版中存在的安全性問題。過去,使用者經過驗證後,對外部檔案的存取就是以 SQL Server 處理序的安全性設定檔為基礎。當 SQL Server 處理序具有讀取某個檔案的存取權,但使用者沒有該檔案的存取權時,如果使用者屬於 bulkadmin 固定伺服器角色成員,則還是可以利用 BULK INSERT 匯入檔案和存取檔案的內容。

從遠端資料檔大量匯入

若要使用 BULK INSERT 或 INSERT...SELECT * FROM OPENROWSET(BULK...) 大量匯入另一部電腦中的資料,必須在兩部電腦之間共用資料檔。若要指定共用資料檔,請使用它的通用命名慣例 (UNC) 名稱,它使用一般格式:\\<Servername>\<Sharename>\<Path>\<Filename>。此外,用來存取資料檔的帳戶必須擁有在遠端磁碟上讀取檔案所需的權限。

例如,下列 BULK INSERT 陳述式會從名為 newdata.txt 的資料檔大量匯入資料到 AdventureWorks2008R2 資料庫的 SalesOrderDetail 資料表。此資料檔位於 computer2 系統上的 salesforce 網路共用目錄上的 \dailyorders 共用資料夾中。

BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO

[!附註]

這個限制並不適用於 bcp 公用程式,因為用戶端可以獨立讀取檔案,不受 SQL Server 影響。