在 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

Windows PowerShell 通常会将 (local) 中的括号字符作为命令处理。您必须:

  • 将路径字符串用引号引起来:

    Set-Location "SQLSERVER:\SQL\(local)\DEFAULT\Databases\AdventureWorks"
    
  • 使用反引号字符 (`) 对括号进行转义。

    Set-Location SQLSERVER:\SQL\`(local`)\DEFAULT\Databases\AdventureWorks
    
  • 使用十六进制表示形式对括号进行编码。

    Set-Location SQLSERVER:\SQL\%28local%29\DEFAULT\Databases\AdventureWorks
    

在本主题的后面部分,将对转义和编码字符进行更详细的讨论。

在 Windows PowerShell 脚本中不能使用句点 (.)来指定本地计算机。由于 Windows PowerShell 会将句点解释为一个命令,因此不支持句点。

默认实例名称

可以在同一台计算机上运行数据库引擎可执行程序的多个实例。数据库引擎的实例由计算机名称和实例名称的组合(如 MyComputer\MyInstance)来标识。

每台计算机都有一个默认的数据库引擎实例。在安装默认实例时,无需为它指定名称。如果在连接字符串中仅指定了计算机名称,则会连接到该计算机上的默认实例。该计算机上的所有其他实例都必须是命名实例。如果在安装过程中指定了实例名称,则必须在连接字符串中同时指定计算机名称和实例名称。

SQL Server 提供程序要求您始终指定实例名称。对于默认实例,必须将实例名称指定为 DEFAULT。

Windows PowerShell 路径中的 SQL Server 标识符

Windows PowerShell 提供程序使用类似于 Windows 文件系统路径的路径结构来公开数据层次结构。SQL Server 提供程序实现了 SQL Server 对象的路径。对于数据库引擎,驱动器设置为 SQLSERVER:,第一个文件夹设置为 \SQL,数据库对象作为容器和项来引用。这是 Purchasing 架构中 Vendor 表的路径,该架构位于默认数据库引擎实例中的 AdventureWorks 数据库中。

SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks\Tables\Purchasing.Vendor

SQL Server 标识符是 SQL Server 对象的名称,如表名或列名。共有两种类型的 SQL Server 标识符:

  • 常规标识符限制为一组在 Windows PowerShell 路径中同样受到支持的字符。无需更改这些名称,即可在 Windows PowerShell 路径中使用它们。

  • 分隔标识符可以使用 Windows PowerShell 路径名称中不支持的字符。如果用中括号将分隔标识符括起来 ([IdentifierName]),则可以将它们称为带中括号的标识符;如果将它们用双引号引起来,则可以将它们称为带引号的标识符 ("IdentifierName")。如果分隔标识符使用 Windows PowerShell 路径中不支持的字符,那么,必须先对这些字符进行编码或转义,才能将标识符用作容器名称或项名称。可以针对所有字符进行编码。而某些字符(如冒号字符 (:))则不能进行转义。

对标识符进行编码和解码

对于 Windows PowerShell 路径名称中不支持的字符,可以表示或编码为“%”字符后跟代表该字符的位模式的十六进制值(如“**%**xx”)。对于 Windows PowerShell 路径中不支持的字符,始终可以使用编码来处理字符。

Encode-SqlName cmdlet 将 SQL Server 标识符作为输入。它输出一个字符串,其中包含所有不受 Windows PowerShell 语言支持且已经用“%xx”编码的字符。Decode-SqlName cmdlet 将经过编码的 SQL Server 标识符作为输入并返回初始标识符。例如:

  • 下面的命令返回字符串“Table%3ATest”:

    Encode-SqlName "Table:Test"
    
  • 下面的命令返回“Table:Test”:

    Decode-SqlName "Table%3ATest"
    

在 Windows PowerShell cmdlet 中指定分隔标识符时,可以亲自提供经过编码的字符值,也可以使用 Encode-SqlName 提供经过编码的字符。例如,如果您已经导航到包含 [Table:Test] 表的架构,则可以通过提供“:”字符的编码版本,借助于 cd 转至该表:

Set-Location Table%3ATest

或者,可以使用 Encode-SqlName 生成由 PowerShell 支持的名称:

Set-Location (Encode-SqlName "Table:Test")

下面的字符可以由 Encode-SqlName 编码且由 Decode-SqlName 解码:

字符

\

/

:

%

<

>

*

?

[

]

|

十六进制编码

%5C

%2F

%3A

%25

%3C

%3E

%2A

%3F

%5B

%5D

%7C

对字符进行转义

通常,可以使用 Windows PowerShell 反引号转义符 (`) 来对 SQL Server 分隔标识符中允许使用但是 Windows PowerShell 路径名称中不允许使用的字符进行转义。但是,对于某些字符,不能对其进行转义。例如,不能对 Windows PowerShell 中的冒号字符 (:) 进行转义。必须对包含该字符的标识符进行编码。由于编码适用于所有字符,因此编码比转义可靠。

下面是对 # 字符进行转义的示例:

cd SQLSERVER:\SQL\MyComputer\MyInstance\MyDatabase\MySchema\`#MyTempTable

反引号字符 (`) 键通常位于键盘左上角 ESC 键的下方。

cmdlet 中的 SQL Server 标识符

某些 SQL Server cmdlet 具有一个将标识符作为输入的参数。参数值通常以带引号的字符串常量或以字符串变量形式提供。如果标识符以字符串常量或变量形式提供,则不会与 Windows PowerShell 支持的字符集发生冲突。