PowerShell での SQL Server 識別子の使用
データベース エンジンで Windows PowerShell 用の SQL Server プロバイダを使用する場合は、既定のインスタンスであっても、コンピュータの名前とインスタンスの名前を指定する必要があります。
このプロバイダでは、Windows PowerShell パスで SQL Server 識別子が使用されます。SQL Server 識別子には、Windows PowerShell のパスではサポートされない文字が含まれている場合があります。Windows PowerShell パスでこの識別子を使用する場合は、これらの文字をエスケープするか、この文字に特殊なエンコードを使用する必要があります。
コンピュータ名
SQLSERVER:\SQL に続く最初のノードは、データベース エンジンのインスタンスが実行されているコンピュータの名前です (たとえば、SQLSERVER:\SQL\MyComputer)。データベース エンジンのインスタンスと同じコンピュータ上で Windows PowerShell を実行している場合は、コンピュータ名の代わりに localhost または (local) を使用できます。localhost または (local) が使用されたスクリプトは、異なるコンピュータ名を反映するための変更を加えることなく、すべてのコンピュータ上で実行できます。たとえば、次のコマンドは、ローカル コンピュータ上の既定のインスタンスの AdventureWorks サンプル データベースを表します。
Set-Location SQLSERVER:\SQL\localhost\DEFAULT\Databases\AdventureWorks
通常、(local) に使用されているかっこ文字は、Windows PowerShell でコマンドとして扱われます。このため、次のいずれかの作業を行う必要があります。
パス文字列を引用符で囲みます。
Set-Location "SQLSERVER:\SQL\(local)\DEFAULT\Databases\AdventureWorks"
バック チック文字 (') を使用して、かっこをエスケープします。
Set-Location SQLSERVER:\SQL\`(local`)\DEFAULT\Databases\AdventureWorks
16 進表現を使用して、かっこをエンコードします。
Set-Location SQLSERVER:\SQL\%28local%29\DEFAULT\Databases\AdventureWorks
文字のエスケープとエンコードについては、このトピックの後半で詳しく説明します。
Windows PowerShell スクリプトでは、ピリオド (.) を使用してローカル コンピュータを指定することはできません。Windows PowerShell ではピリオドはコマンドとして解釈されるため、ピリオドはサポートされません。
既定のインスタンス名
データベース エンジンの実行可能プログラムの複数のインスタンスを、同じコンピュータで実行できます。データベース エンジンのインスタンスは、コンピュータ名とインスタンス名の組み合わせ (MyComputer\MyInstance など) で識別されます。
各コンピュータでは、データベース エンジンの既定のインスタンスを 1 つだけ使用できます。既定のインスタンスには、そのインストール時に名前を指定しません。接続文字列にコンピュータ名のみを指定すると、そのコンピュータの既定のインスタンスに接続されます。コンピュータ上のその他すべてのインスタンスは、名前付きインスタンスにする必要があります。インスタンス名はセットアップ時に指定します。接続文字列には、コンピュータ名とインスタンス名の両方を指定する必要があります。
SQL Server プロバイダでは、常にインスタンス名を指定する必要があります。既定のインスタンスには、DEFAULT というインスタンス名を指定する必要があります。
Windows PowerShell パス内の SQL Server 識別子
Windows PowerShell プロバイダは、Windows ファイル システムで使用されるようなパス構造を使用してデータ階層を公開します。SQL Server プロバイダは、SQL Server オブジェクトへのパスを実装します。データベース エンジンについては、ドライブが SQLSERVER: に、最初のフォルダが \SQL に設定され、データベース オブジェクトがコンテナおよびアイテムとして参照されます。これは、データベース エンジンの既定のインスタンスにある AdventureWorks データベースの Purchasing スキーマ内の Vendor テーブルへのパスです。
SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks\Tables\Purchasing.Vendor
SQL Server 識別子は、テーブル名や列名などの SQL Server オブジェクトの名前です。SQL Server 識別子には 2 つの種類があります。
標準識別子には、Windows PowerShell パスでもサポートされている一連の文字のみを使用できます。これらの名前は、変更することなく Windows PowerShell パスで使用できます。
区切られた識別子には、Windows PowerShell パス名ではサポートされない文字を使用できます。区切られた識別子には、角かっこで囲まれた識別子 ([IdentifierName]) と二重引用符で囲まれた識別子 ("IdentifierName") があります。区切られた識別子に Windows PowerShell パスではサポートされない文字を使用する場合は、識別子をコンテナ名またはアイテム名として使用する前に、その文字をエンコードまたはエスケープする必要があります。エンコードはすべての文字に有効です。コロン (:) などの一部の文字は、エスケープできません。
識別子のエンコードとデコード
Windows PowerShell パス名でサポートされない文字は、"**%**xx" のように、"%" 文字の後に文字を表すビット パターンの 16 進値を付加して表す、つまりエンコードすることができます。エンコードは、Windows PowerShell パスでサポートされない文字を処理する場合にいつでも使用できます。
Encode-SqlName コマンドレットは、SQL Server 識別子を入力として使用します。また、Windows PowerShell 言語ではサポートされないすべての文字を "%xx" でエンコードした文字列を出力します。Decode-SqlName コマンドレットは、エンコードされた SQL Server 識別子を入力として受け取り、元の識別子を返します。次に例を示します。
次のコマンドは、文字列 "Table%3ATest" を返します。
Encode-SqlName "Table:Test"
次のコマンドは、"Table:Test" を返します。
Decode-SqlName "Table%3ATest"
Windows PowerShell コマンドレットで区切られた識別子を指定する場合は、エンコードした文字値を自分で指定するか、Encode-SqlName を使用してエンコードされた文字を指定できます。たとえば、テーブル [Table:Test] を含んでいるスキーマに既に移動している場合は、":" 文字のエンコードされたバージョンを指定することで、そのテーブルへの cd を実行できます。
Set-Location Table%3ATest
あるいは、Encode-SqlName を使用して PowerShell でサポートされる名前を作成できます。
Set-Location (Encode-SqlName "Table:Test")
Encode-SqlName によってエンコードされ、Decode-SqlName によってデコードされる文字を次に示します。
文字 |
\ |
/ |
: |
% |
< |
> |
* |
? |
[ |
] |
| |
16 進エンコード |
%5C |
%2F |
%3A |
%25 |
%3C |
%3E |
%2A |
%3F |
%5B |
%5D |
%7C |
文字のエスケープ
SQL Server の区切れらた識別子には使用でき、Windows PowerShell パス名には使用できない文字をエスケープするためによく使用されるのが、Windows PowerShell のバック チック エスケープ文字 (`) です。ただし、エスケープできない文字もあります。たとえば、Windows PowerShell ではコロン文字 (:) をエスケープできません。この文字を含んだ識別子は、エンコードする必要があります。エンコードは、すべての文字に有効であるため、エスケープよりも確実です。
次に示すのは、# 文字をエスケープする例です。
cd SQLSERVER:\SQL\MyComputer\MyInstance\MyDatabase\MySchema\`#MyTempTable
通常、バック チック文字 (`) のキーは、キーボード左上の Esc キーの下にあります (英語キーボードの場合)。
コマンドレットでの SQL Server 識別子
SQL Server コマンドレットには、識別子を入力として使用するパラメータを持つものがあります。このパラメータの値は、通常、引用符で囲まれた文字列定数として指定されるか、文字列変数で指定されます。識別子を文字列定数または文字列変数で指定すると、Windows PowerShell でサポートされる一連の文字と競合することがありません。