FileTable へのファイルの読み込み

適用対象:SQL Server

FileTable にファイルを読み込むまたは移行する方法について説明します。

FileTable へのファイルの読み込みまたは移行

FileTable へのファイルの読み込みや移行の方法は、ファイルが現在格納されている場所によって異なります。

ファイルの現在の場所 移行のオプション
ファイルは現在、ファイル システム内に格納されている。

SQL Server にはファイルに関する情報がありません。
FileTable は Windows ファイル システムにおいてフォルダーとして表示されるため、ファイルの移動またはコピーに使用できる任意の方法で、ファイルを新しい FileTable に簡単に読み込むことができます。 これらの方法には、Windows エクスプローラー、コマンド ライン オプション (xcopy、robocopy)、およびカスタム スクリプトまたはアプリケーションが含まれます。

既存のフォルダーを FileTable に変換することはできません。
ファイルは現在、ファイル システム内に格納されている。

SQL Server には、ファイルへのポインターが格納されたメタデータのテーブルが含まれています。
まず、前の項目で示したいずれかの方法を使用して、ファイルを移動またはコピーします。

次に、ファイルの新しい場所を指すように既存のメタデータのテーブルを更新します。

詳しくは、この記事の「例: ファイルをファイル システムから FileTable に移行する」をご覧ください。

方法: FileTable にファイルを読み込む

次の方法を使って、ファイルを FileTable に読み込むことができます。

  • Windows エクスプローラーで、基になるフォルダーから新しい FileTable フォルダーにファイルをドラッグ アンド ドロップします。

  • コマンド プロンプト、バッチ ファイル、またはスクリプトでコマンド ライン オプション (MOVE、COPY、XCOPY、ROBOCOPY など) を使います。

  • カスタム アプリケーションを作成して、C# または Visual Basic.NET のファイルを移動またはコピーします。 System.IO 名前空間からメソッドを呼び出します。

例: ファイルをファイル システムから FileTable に移行する

このシナリオでは、ファイルはファイル システムに格納されていて、このファイルへのポインターを含むメタデータのテーブルが SQL Server に配置されています。 ここでは、ファイルを FileTable に移動した後、メタデータ内の各ファイルの元の UNC パスを FileTable の UNC パスに置き換えます。 この操作を行うには、GetPathLocator (Transact-SQL) 関数を使用します。

この例では、写真に関するデータが含まれている PhotoMetadataという名前の既存のデータベース テーブルがあると仮定しています。 このテーブルには、.jpg ファイルへの実際の UNC パスを含む varchar (512) 型の列 UNCPathがあります。

画像ファイルをファイル システムから FileTable に移行するには、次のことを実行する必要があります。

  1. ファイルを格納する新しい FileTable を作成します。 この例では、 dbo.PhotoTableというテーブル名を使用しますが、テーブルを作成するコードは示されていません。

  2. xcopy または同様のツールを使用して、ディレクトリ構造を保ったまま .jpg ファイルを FileTable のルート ディレクトリにコピーします。

  3. 次の例のようなコードを使って、PhotoMetadata テーブル内のメタデータを修正します。

--  Add a path locator column to the PhotoMetadata table.  
ALTER TABLE PhotoMetadata ADD pathlocator hierarchyid;  
  
-- Get the root path of the Photo directory on the File Server.  
DECLARE @UNCPathRoot varchar(100) = '\\RemoteShare\Photographs';  
  
-- Get the root path of the FileTable.  
DECLARE @FileTableRoot varchar(1000);  
SELECT @FileTableRoot = FileTableRootPath('dbo.PhotoTable');  
  
-- Update the PhotoMetadata table.  
  
-- Replace the File Server UNC path with the FileTable path.  
UPDATE PhotoMetadata  
    SET UNCPath = REPLACE(UNCPath, @UNCPathRoot, @FileTableRoot);  
  
-- Update the pathlocator column to contain the pathlocator IDs from the FileTable.  
UPDATE PhotoMetadata  
    SET pathlocator = GetPathLocator(UNCPath);  

FileTable へのファイルの一括読み込み

FileTable の一括操作は通常のテーブルの動作と同じですが、次の制限があります。

FileTable には、ファイル/ディレクトリ名前空間の整合性を確保するためにシステムによって定義された制約があります。 これらの制約は、FileTable に一括で読み込まれるデータに対しても検証されます。 一部の一括挿入操作ではテーブル制約の無視が許可されるため、次の要件が適用されます。

  • 制約が適用される一括読み込み操作は、FileTable でも他のテーブルに対する操作と同じように実行できます。 このカテゴリには以下の操作が含まれます。

    • CHECK_CONSTRAINTS 句を含む bcp

    • CHECK_CONSTRAINTS 句を含む BULK INSERT

    • IGNORE_CONSTRAINTS 句を含まない INSERT INTO ...SELECT * FROM OPENROWSET(BULK ...)。

  • FileTable のシステム定義の制約が無効化されない限り、制約が適用されない一括読み込み操作は失敗します。 このカテゴリには以下の操作が含まれます。

    • CHECK_CONSTRAINTS 句を含まない bcp

    • CHECK_CONSTRAINTS 句を含まない BULK INSERT

    • IGNORE_CONSTRAINTS 句を含む INSERT INTO ... SELECT * FROM OPENROWSET(BULK ...)。

方法: FileTable へのファイルの一括読み込みを行う

ファイルを FileTable に一括読み込みするには、次の方法を使用できます。

  • bcp

    • CHECK_CONSTRAINTS 句を指定して呼び出します。

    • FileTable 名前空間を無効にし、 CHECK_CONSTRAINTS 句を指定せずに呼び出します。 次に、FileTable 名前空間を再有効化します。

  • BULK INSERT

    • CHECK_CONSTRAINTS 句を指定して呼び出します。

    • FileTable 名前空間を無効にし、 CHECK_CONSTRAINTS 句を指定せずに呼び出します。 次に、FileTable 名前空間を再有効化します。

  • INSERT INTO … SELECT FROM OPENROWSET(BULK …)

    • IGNORE_CONSTRAINTS 句を指定して呼び出します。

    • FileTable 名前空間を無効にし、 IGNORE_CONSTRAINTS 句を指定せずに呼び出します。 次に、FileTable 名前空間を再有効化します。

FileTable 制約の無効化の詳細については、「 FileTable の管理」を参照してください。

方法: 一括読み込みのための FileTable の制約を無効化する

システム定義の制約を一時的に無効化すると、制約の適用というオーバーヘッドなしで、FileTable へのファイルの一括読み込みを行うことができます。 詳細については、「 FileTable の管理」を参照してください。

参照

Transact SQL を使用した FileTable へのアクセス
ファイル I/O API を使用した FileTable へのアクセス