在 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) 的脚本可在任何计算机上运行,而无需进行更改来反映不同计算机名称。例如,此命令可用于本地计算机上默认实例中的 AdventureWorks2008R2 示例数据库:
Set-Location SQLSERVER:\SQL\localhost\DEFAULT\Databases\AdventureWorks2008R2
Windows PowerShell 通常会将 (local) 中的括号字符作为命令处理。您必须:
将路径字符串用引号引起来:
Set-Location "SQLSERVER:\SQL\(local)\DEFAULT\Databases\AdventureWorks2008R2"
使用反引号字符 (`) 对括号进行转义。
Set-Location SQLSERVER:\SQL\`(local`)\DEFAULT\Databases\AdventureWorks2008R2
使用十六进制表示形式对括号进行编码。
Set-Location SQLSERVER:\SQL\%28local%29\DEFAULT\Databases\AdventureWorks2008R2
在本主题的以下部分,将对转义和编码字符进行更详细的讨论。
在 PowerShell 脚本中不能使用句点 (.)来指定本地计算机。由于 PowerShell 会将句点解释为一个命令,因此不支持句点。
默认实例名称
可以在同一台计算机上运行数据库引擎可执行程序的多个实例。数据库引擎的实例由计算机名称和实例名称的组合(如 MyComputer\MyInstance)来标识。
每台计算机都有一个默认的数据库引擎实例。在安装默认实例时,无需为它指定名称。如果在连接字符串中仅指定了计算机名称,则会连接到该计算机上的默认实例。该计算机上的所有其他实例都必须是命名实例。如果在安装过程中指定了实例名称,则必须在连接字符串中同时指定计算机名称和实例名称。
SQL Server 提供程序要求您始终指定实例名称。对于默认实例,必须将实例名称指定为 DEFAULT。
Windows PowerShell 路径中的 SQL Server 标识符
Windows PowerShell 提供程序使用类似于 Windows 文件系统路径的路径结构来公开数据层次结构。SQL Server 提供程序实现了 SQL Server 对象的路径。对于数据库引擎,驱动器设置为 SQLSERVER:,第一个文件夹设置为 \SQL,数据库对象作为容器和项来引用。这是 Purchasing 架构中 Vendor 表的路径,该架构位于默认数据库引擎实例的 AdventureWorks2008R2 数据库中:
SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks2008R2\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 生成由 Windows 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 支持的字符集发生冲突。