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 でサポートされる一連の文字と競合することがありません。