BULK INSERT または OPENROWSET(BULK...) を使用した一括データのインポート

更新 : 2006 年 7 月 17 日

このトピックでは、Transact-SQL BULK INSERT ステートメントと INSERT...SELECT * FROM OPENROWSET(BULK...) ステートメントを使用して、データ ファイルから Microsoft SQL Server のテーブルにデータを一括インポートする方法の概要を説明します。また、BULK INSERT および OPENROWSET(BULK...) を使用する場合のセキュリティの注意点や、リモート データ ソースから一括インポートする方法についても説明します。

ms175915.note(ja-jp,SQL.90).gifメモ :
BULK INSERT またはOPENROWSET(BULK...) を使用する場合、SQL Server 2005 で権限の借用がどのように処理されるかを理解しておくことが重要です。詳細については、後の「セキュリティの注意点」を参照してください。

BULK INSERT ステートメント

BULK INSERT では、データ ファイルからテーブルにデータが読み込まれます。この機能は、bcp コマンドの in オプションと似ていますが、データ ファイルが SQL Server プロセスによって読み取られる点が異なります。BULK INSERT の構文の説明については、「BULK INSERT (Transact-SQL)」を参照してください。

BULK INSERT の例については、次のトピックを参照してください。

OPENROWSET(BULK...) 関数

SQL Server 2005 では OPENROWSET 一括行セット プロバイダが導入されました。BULK オプションを指定して OPENROWSET 関数を呼び出すことによって、このプロバイダにアクセスします。OPENROWSET(BULK...) 関数では、OLE DB プロバイダ経由でデータ ファイルなどのリモート データ ソースに接続することで、リモート データにアクセスできます。

データを一括インポートするには、INSERT ステートメントの SELECT...FROM 句から OPENROWSET(BULK...) を呼び出します。データの一括インポートの基本構文は次のとおりです。

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

OPENROWSET(BULK...) を INSERT ステートメント内で使用する場合は、テーブル ヒントがサポートされます。BULK 句では、TABLOCK などの通常のテーブル ヒント以外に、特殊なテーブル ヒント IGNORE_CONSTRAINTS (CHECK 制約だけを無視)、IGNORE_TRIGGERS、KEEPDEFAULTS、KEEPIDENTITY を使用できます。詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。

BULK オプションの上記以外の使い方の詳細については、「OPENROWSET (Transact-SQL)」を参照してください。

INSERT...SELECT * FROM OPENROWSET(BULK...) ステートメントの例については、次のトピックを参照してください。

セキュリティの注意点

ユーザーが SQL Server ログインを使用する場合は、SQL Server プロセス アカウントのセキュリティ プロファイルが使用されます。

これに対して、SQL Server ユーザーが Windows 認証を使用してログオンした場合、そのユーザーは SQL Server プロセスのセキュリティ プロファイルに関係なく、そのユーザー アカウントでアクセス可能なファイルのみを読み取ることができます。

たとえば、SQL Server のインスタンスに Windows 認証を使用してログインしたユーザーを考えます。ユーザーが 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 上のテーブルにデータを一括インポートできます。詳細については、「権限借用の概要」を参照してください。

ms175915.note(ja-jp,SQL.90).gifメモ :
SQL Server 2005 におけるファイルへのアクセス権の制御によって、Microsoft SQL Server 2000 およびそれ以前のバージョンにあったセキュリティの問題に対処できます。以前は、ユーザーの認証後、外部ファイルへのアクセス権は SQL Server プロセスのセキュリティ プロファイルに基づいていました。SQL Server プロセスにファイルの読み取りアクセス権がある場合、ユーザーにそのファイルへのアクセス権がなくても、bulkadmin 固定サーバ ロールのメンバであれば、BULK INSERT を使用してファイルをインポートし、ファイルのコンテンツにアクセスできていました。

リモート データ ファイルからの一括インポート

BULK INSERT または INSERT...SELECT * FROM OPENROWSET(BULK...) を使用して別のコンピュータからデータを一括インポートするには、データ ファイルを 2 つのコンピュータ間で共有している必要があります。共有データ ファイルを指定するには、UNC (汎用名前付け規則) 名を使用します。UNC 名の一般的な形式は、**\\Servername\Sharename\Path\**Filename です。SQL Server で使用されるユーザー アカウントは、リモート ディスク上のファイルの読み取りに必要な権限を持っている必要があります。

たとえば、次の BULK INSERT ステートメントでは、newdata.txt というデータ ファイルから AdventureWorks データベースの SalesOrderDetail テーブルにデータの一括インポートを行います。このデータ ファイルは、computer2 というシステムの salesforce というネットワーク共有ディレクトリの \dailyorders という共有フォルダにあります。

BULK INSERT AdventureWorks.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO
ms175915.note(ja-jp,SQL.90).gifメモ :
クライアントが読み取るファイルは SQL Server とは無関係であるため、bcp にはこの制限は適用されません。

参照

概念

一括データのインポートおよびエクスポート
一括インポート操作と一括エクスポート操作について
データの一括インポートに関する基本的なガイドライン

その他の技術情報

INSERT (Transact-SQL)
権限借用の概要
INSERT (Transact-SQL)
SELECT 句 (Transact-SQL)
OPENROWSET (Transact-SQL)
SELECT (Transact-SQL)
FROM (Transact-SQL)
bcp ユーティリティ
BULK INSERT (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 7 月 17 日

変更内容 :

2005 年 12 月 5 日

新しい内容 :
  • Transact-SQL コマンドを使用してリモート データ ファイルからデータをインポートする方法の説明を追加しました。