Share via


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

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

[!附註]

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

BULK INSERT 陳述式

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

範例

如需 BULK INSERT 範例,請參閱:

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)>。

範例

如需 INSERT...SELECT * FROM OPENROWSET(BULK...) 陳述式的範例,請參閱下列主題:

安全性考量

如果使用者是使用 SQL Server 登入,則會使用 SQL Server 處理序帳戶的安全性設定檔。 使用 SQL Server 驗證的登入無法於 Database Engine 外部進行驗證。 因此,一旦使用 SQL Server 驗證的登入起始 BULK INSERT 命令,將會使用 SQL Server 處理序帳戶 (即 SQL Server Database Engine 服務所使用的帳戶) 的安全性內容建立與資料的連接。 為了能夠成功讀取來源資料,您必須授與 SQL Server Database Engine 所使用的帳戶對來源資料的存取權。相反地,如果 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 執行個體。 此設置也稱為「模擬」(Impersonation) 或「委派」(Delegation)。 當您使用 BULK INSERT 或 OPENROWSET 時,請務必了解 SQL Server 版本如何處理使用者模擬的安全性。 使用者模擬允許資料檔案位於和 SQL Server 處理序或使用者不同的電腦上。 例如,如果位於 Computer_A 的使用者可以存取 Computer_B 上的資料檔,且已適當設定認證委派,則使用者可以連接到執行於 Computer_C 上的 SQL Server 執行個體,然後存取 Computer_B 上的資料檔,並從該檔案大量匯入資料到 Computer_C 上的資料表。

從遠端資料檔大量匯入

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

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

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

[!附註]

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

請參閱

參考

INSERT (Transact-SQL)

SELECT 子句 (Transact-SQL)

OPENROWSET (Transact-SQL)

SELECT (Transact-SQL)

FROM (Transact-SQL)

bcp 公用程式

BULK INSERT (Transact-SQL)

概念

資料的大量匯入及匯出 (SQL Server)