Usar los identificadores de SQL Server en PowerShell

Cuando se utiliza el proveedor de SQL Server para Windows PowerShell con Motor de base de datos, se deben proporcionar los nombres tanto del equipo como de la instancia, incluso para las instancias predeterminadas.

El proveedor utiliza los identificadores de SQL Server en las rutas de acceso de Windows PowerShell. Los identificadores de SQL Server pueden contener caracteres que Windows PowerShell no admita en las rutas. Debe hacer que estos caracteres se eludan o usar una codificación especial para ellos al utilizar los identificadores en las rutas de Windows PowerShell.

Nombres de equipos

El primer nodo situado a continuación de SQLSERVER:\SQL es el nombre del equipo en el que se ejecuta la instancia de Motor de base de datos; por ejemplo, SQLSERVER:\SQL\MiEquipo. Si está ejecutando Windows PowerShell en el mismo equipo que la instancia de Motor de base de datos, puede utilizar localhost o (local) en lugar del nombre del equipo. Los scripts que usan localhost o (local) se pueden ejecutar en cualquier equipo sin tener que cambiar para reflejar los distintos nombres de los equipos. Por ejemplo, este comando irá a la base de datos de ejemplo AdventureWorks2008R2 en la instancia predeterminada del equipo local:

Set-Location SQLSERVER:\SQL\localhost\DEFAULT\Databases\AdventureWorks2008R2

Windows PowerShell suele tratar como comandos los caracteres que van entre paréntesis de (local). Debe:

  • Poner las cadenas de ruta de acceso entre comillas:

    Set-Location "SQLSERVER:\SQL\(local)\DEFAULT\Databases\AdventureWorks2008R2"
    
  • Eludir el paréntesis mediante el carácter de acento invertido (').

    Set-Location SQLSERVER:\SQL\`(local`)\DEFAULT\Databases\AdventureWorks2008R2
    
  • Codificar el paréntesis mediante su representación hexadecimal.

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

Los caracteres de escape y codificación se tratan detalladamente más adelante en este tema.

No puede utilizar un punto (.) cuando especifica el equipo local en scripts de PowerShell. No se admite el punto porque PowerShell lo interpreta como comando.

Nombres de instancias predeterminadas

Puede ejecutar varias instancias del programa ejecutable de Motor de base de datos en el mismo equipo. La combinación del nombre del equipo y un nombre de instancia, como MiEquipo\MiInstancia, identifica las instancias de Motor de base de datos.

Cada equipo puede tener una instancia predeterminada de Motor de base de datos. No especifique un nombre para la instancia predeterminada al instalarla. Si especifica solamente un nombre de equipo en una cadena de conexión, se conectará a la instancia predeterminada en ese equipo. Todas las demás instancias en el equipo deben ser instancias con nombre. Durante la instalación se especifica el nombre de instancia y las cadenas de conexión deben especificar tanto el nombre de equipo como el nombre de instancia.

El proveedor de SQL Server requiere que siempre se especifique un nombre de instancia. Para las instancias predeterminadas, debe especificar el nombre de instancia DEFAULT.

Identificadores de SQL Server en rutas de Windows PowerShell

Los proveedores de Windows PowerShell exponen las jerarquías de datos utilizando una estructura de ruta similar a la que se usa para el sistema de archivos de Windows. El proveedor de SQL Server implementa rutas a los objetos de SQL Server. En Motor de base de datos, la unidad se establece en SQLSERVER:, la primera carpeta se establece en \SQL y se hace referencia a los objetos de la base de datos como contenedores y elementos. Esta es la ruta de acceso a la tabla Vendor en el esquema Purchasing de la base de datos AdventureWorks2008R2 en una instancia predeterminada de Motor de base de datos:

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

Los identificadores de SQL Server son los nombres de los objetos de SQL Server, tales como nombres de tabla o de columna. Hay dos tipos de identificadores de SQL Server:

  • Los identificadores normales se limitan a un juego de caracteres que también se admite en las rutas de Windows PowerShell. Estos nombres se pueden utilizar en las rutas de Windows PowerShell sin cambiarse.

  • Los identificadores delimitados pueden utilizar caracteres no admitidos en los nombres de ruta de Windows PowerShell. Los identificadores delimitados se denominan identificadores entre corchetes si se escriben entre corchetes ([nombreDeIdentificador]) e identificadores entrecomillados si se escriben entre comillas dobles ("nombreDeIdentificador"). Si un identificador delimitado utiliza caracteres no admitidos en las rutas de Windows PowerShell, estos se deben codificar o hacer que se eludan antes de utilizar el identificador como contenedor o nombre de elemento. La codificación funciona con todos los caracteres. En el caso de ciertos caracteres, como el carácter de dos puntos (:), no se puede hacer que se eludan.

Codificar y descodificar identificadores

Los caracteres que no se admiten en los nombres de ruta de Windows PowerShell se pueden representar, o codificar, como el carácter "%" seguido del valor hexadecimal del modelo de bits que representa el carácter, como en "**%**xx". La codificación siempre se puede utilizar para controlar los caracteres que no se admiten en las rutas de Windows PowerShell.

El cmdlet Encode-SqlName toma como entrada un identificador de SQL Server. Genera una cadena con todos los caracteres que no son admitidos por el lenguaje de Windows PowerShell codificados con "%xx". El cmdlet Decode-SqlName toma como entrada un identificador de SQL Server codificado y devuelve el identificador original. Por ejemplo:

  • Este comando devuelve la cadena "Table%3ATest":

    Encode-SqlName "Table:Test"
    
  • Este comando devuelve "Table:Test":

    Decode-SqlName "Table%3ATest"
    

Cuando se especifican identificadores delimitados en cmdlets de Windows PowerShell, se pueden proporcionar los valores de caracteres codificados por uno mismo o usar Encode-SqlName para proporcionar los caracteres codificados. Por ejemplo, si ya ha navegado al esquema que contiene la tabla [Table:Test], puede hacer cd a la tabla proporcionando la versión codificada del carácter ":":

Set-Location Table%3ATest

También puede utilizar Encode-SqlName para generar un nombre admitido por Windows PowerShell:

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

Estos son los caracteres codificados por Encode-SqlName y descodificados por Decode-SqlName:

Carácter

\

/

:

%

<

>

*

?

[

]

|

Codificación hexadecimal

%5C

%2F

%3A

%25

%3C

%3E

%2A

%3F

%5B

%5D

%7C

Evitar caracteres

A menudo, se puede utilizar el carácter de escape de acento invertido (`) de Windows PowerShell para hacer que se eludan los caracteres que se permiten en los identificadores delimitados de SQL Server pero no en los nombres de ruta de Windows PowerShell. Sin embargo, algunos caracteres no se pueden evitar. Por ejemplo, no puede hacer que se eluda el carácter de dos puntos (:) en Windows PowerShell. Los identificadores con ese carácter deben codificarse. La codificación es más confiable que hacer que el carácter se eluda porque funciona para todos los caracteres.

Este es un ejemplo en el que se hace que se eluda un carácter #:

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

El carácter de acento invertido (`) suele estar en la tecla de la parte superior izquierda del teclado, debajo de la tecla ESC.

Identificadores de SQL Server en cmdlets

Algunos cmdlets de SQL Server tienen un parámetro que toma un identificador como entrada. Los valores de los parámetros se suelen proporcionar como constantes de cadena entrecomilladas o en variables de cadena. Cuando los identificadores se proporcionan como constantes de cadena o en variables, no hay ningún conflicto con el juego de caracteres admitidos por Windows PowerShell.