Ejecutar SQL Server PowerShell

SQL Server instala Windows PowerShell y un conjunto de complementos de SQL Server que exponen la funcionalidad de SQL Server en Windows PowerShell. Puede codificar a continuación scripts de Windows PowerShell que funcionen con objetos de SQL Server. Los scripts se pueden ejecutar en el entorno de Windows PowerShell, en SQL Server Management Studio y como trabajos del Agente SQL Server.

Instalar compatibilidad con SQL Server PowerShell

Para instalar el software necesario para ejecutar scripts de Windows PowerShell, use el programa de instalación de SQL Server. A partir de SQL Server 2008, el programa de instalación instala los componentes de Windows PowerShell siguientes al seleccionar el software cliente o los nodos de Servicios de bases de datos:

  • Windows PowerShell 1.0, si Windows PowerShell no está presente aún en el equipo.

  • Los complementos de SQL Server. Los complementos son archivos DLL que implementan dos tipos de compatibilidad con Windows PowerShell para SQL Server:

    • Un conjunto de cmdlets de SQL Server. Los cmdlets son comandos que implementan una acción concreta. Por ejemplo, Invoke-Sqlcmd ejecuta un script de Transact-SQL o XQuery que también se puede ejecutar mediante la utilidad sqlcmd e Invoke-PolicyEvaluation informa si los objetos de SQL Server cumplen las directivas de administración basadas en directivas.

    • Un proveedor de SQL Server. El proveedor permite navegar por la jerarquía de objetos de SQL Server utilizando una ruta de acceso similar a una ruta de acceso al sistema de archivos. Cada objeto se asocia a una clase de los modelos de objetos de administración de SQL Server. Puede utilizar los métodos y las propiedades de la clase para realizar un trabajo en los objetos. Por ejemplo, si cambia el directorio a un objeto de bases de datos en una ruta de acceso, puede utilizar los métodos y las propiedades de la clase Microsoft.SqlServer.Managment.SMO.Database para administrar la base de datos.

  • La utilidad sqlps que se emplea para ejecutar sesiones de Windows PowerShell que incluyen los complementos de SQL Server.

A partir de SQL Server 2008, SQL Server Management Studio admite el inicio de sesiones de Windows PowerShell desde el árbol del Explorador de objetos. También a partir de SQL Server 2008, el Agente SQL Server es compatible con los pasos de trabajo de Windows PowerShell.

Si se desinstala Windows PowerShell después de finalizar la instalación, las características de SQL Server para Windows PowerShell no funcionarán. Los usuarios de Windows pueden desinstalar Windows PowerShell y puede ser necesario desinstalar Windows PowerShell para realizar determinadas actualizaciones del sistema operativo Windows. Si se ha desinstalado Windows PowerShell y desea utilizar las características de SQL Server, debe realizar una de las acciones siguientes:

  • Descargar y volver a instalar manualmente Windows PowerShell 1.0 desde el Centro de descarga de Microsoft. Las instrucciones para la descarga están en el sitio web de Windows Server 2003.

  • Si está ejecutando Windows Server 2008, Windows PowerShell 1.0 se encuentra en el sistema operativo, pero está deshabilitado de forma predeterminada. Puede volver a habilitarlo desde Windows Server 2008.

Versiones admitidas de SQL Server

Debe usar los componentes de cliente de SQL Server 2008 para ejecutar Windows PowerShell. El proveedor de Windows PowerShell se puede conectar a instancias de SQL Server 2000 o versiones posteriores. La versión anterior de SQL Server 2005 que puede utilizar es SP2. La versión anterior de SQL Server 2000 que puede utilizar es SP4. Cuando Windows PowerShell se conecta a SQL Server 2005 y SQL Server 2000, se limita a la funcionalidad disponible de esas versiones de SQL Server.

Usar la utilidad sqlps

sqlps es una utilidad que crea un entorno de Windows PowerShell y, a continuación, carga y registra los complementos de SQL Server. Puede usar sqlps para:

  • Ejecutar interactivamente comandos de Windows PowerShell.

  • Ejecutar archivos de script de Windows PowerShell.

  • Ejecutar cmdlets de SQL Server.

  • Usar las rutas de acceso del proveedor de SQL Server para navegar por la jerarquía de objetos de SQL Server.

De forma predeterminada, sqlps se ejecuta con la directiva de ejecución de scripts establecida en Restringida, lo que evita la ejecución de cualquier script de Windows PowerShell. Puede utilizar el cmdlet Set-ExecutionPolicy para habilitar la ejecución de scripts con firma o de cualquier script. Ejecute solo scripts de orígenes de confianza y proteja todos los archivos de entrada y salida utilizando los permisos NTFS adecuados. Para obtener más información sobre cómo habilitar scripts de Windows PowerShell, vea cómo ejecutar scripts de Windows PowerShell.

Para obtener más información, vea Utilidad sqlps.

Usar Windows PowerShell en SQL Server Management Studio

Puede iniciar sesiones de Windows PowerShell en SQL Server Management Studio haciendo clic con el botón secundario en objetos del Explorador de objetos y seleccionando Iniciar PowerShell. SQL Server Management Studio inicia entonces una sesión de Windows PowerShell en la que los complementos de SQL Server PowerShell se han cargado y registrado. La ruta de acceso para la sesión se preestablece en la ubicación del objeto en el que hizo clic con el botón secundario en el Explorador de objetos. Por ejemplo, si hace clic con el botón secundario en el objeto de base de datos AdventureWorks2008R2 en el Explorador de objetos y selecciona Iniciar PowerShell, la ruta de acceso de PowerShell se establece en lo siguiente:

SQLSERVER:\SQL\MyComputer\MyInstance\Databases\AdventureWorks2008R2>

Usar Windows PowerShell en pasos de trabajo del Agente SQL Server

Hay varios tipos de pasos de trabajo del Agente SQL Server. Cada tipo se asocia a un subsistema que implementa un entorno concreto, como un agente de replicación o un entorno del símbolo del sistema. El subsistema del Agente SQL Server para Windows PowerShell admite pasos de trabajo que ejecutan scripts de Windows PowerShell. Puede codificar scripts de Windows PowerShell y, a continuación, utilizar el Agente SQL Server para incluir los scripts en trabajos que se ejecuten en los momentos programados o como respuesta a eventos de SQL Server. El subsistema de Windows PowerShell del Agente SQL Server carga y registra los complementos de SQL Server para que se puedan ejecutar sus scripts.

Para obtener más información, vea Subsistemas del Agente SQL Server.

Nota de advertenciaAdvertencia

Cada paso de trabajo de SQL Server inicia un proceso sqlps que consume aproximadamente 20 MB de memoria. Si ejecuta muchos pasos de trabajo de Windows PowerShell simultáneos, el rendimiento se puede ver afectado adversamente.

Agregar los complementos de SQL Server a Windows PowerShell

La utilidad sqlps es un shell mínimo de Windows PowerShell. Este tipo de elementos presenta ciertas restricciones. Por ejemplo, están codificados para cargar uno o varios complementos de Windows PowerShell, pero los usuarios y scripts no pueden agregar otros complementos. Si requiere alguna funcionalidad que un shell mínimo no admita, por ejemplo trabajar con los complementos de SQL Server o de otros productos, puede agregar directamente los complementos de SQL Server en un entorno de Windows PowerShell.

Pegue el código siguiente en el Bloc de notas y guárdelo como un archivo de script ps1 en el equipo, por ejemplo como C:\Micarpeta\InicializarSQLProvider.ps1:

# Add the SQL Server Provider.

$ErrorActionPreference = "Stop"

$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
{
    throw "SQL Server Provider for Windows PowerShell is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


# Set mandatory variables for the SQL Server provider
Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0
Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30
Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false
Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000

# Load the snapins, type data, format data
Push-Location
cd $sqlpsPath
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
Update-TypeData -PrependPath SQLProvider.Types.ps1xml 
update-FormatData -prependpath SQLProvider.Format.ps1xml 
Pop-Location

Después puede usar el script para iniciar el entorno de Windows PowerShell en el que están cargados los complementos de SQL Server mediante el uso de este comando:

PowerShell -NoExit -Command "C:\MyFolder\InitializeSQLProvider.ps1"

El comando se puede ejecutar en un símbolo del sistema, desde un acceso directo al escritorio o desde el cuadro de diálogo Ejecutar del menú Inicio. De forma predeterminada, Windows PowerShell se ejecuta en modo Restringido, que no permite ejecutar scripts. Para obtener más información sobre cómo habilitar scripts de Windows PowerShell, vea cómo ejecutar scripts de Windows PowerShell.

Cargar objetos de administración de SQL Server en Windows PowerShell

El proveedor de SQL Server carga automáticamente los ensamblados del objeto de administración de SQL Server (SMO). Hay dos casos en los que puede que tenga que cargar los ensamblados de SMO directamente:

  • Si un script hace referencia a un objeto de SMO antes del primer comando que hace referencia al proveedor o cmdlets desde los complementos de SQL Server.

  • Se desea pasar código de SMO desde otro lenguaje, como C# o VB.Net, que no utiliza el proveedor sino cmdlets.

El código siguiente carga los ensamblados de SMO:

# Loads the SQL Server Management Objects (SMO)

$ErrorActionPreference = "Stop"

$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
{
    throw "SQL Server Provider for Windows PowerShell is not installed."
}
else
{
    $item = Get-ItemProperty $sqlpsreg
    $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}


$assemblylist = 
"Microsoft.SqlServer.Management.Common",
"Microsoft.SqlServer.Smo",
"Microsoft.SqlServer.Dmf ",
"Microsoft.SqlServer.Instapi ",
"Microsoft.SqlServer.SqlWmiManagement ",
"Microsoft.SqlServer.ConnectionInfo ",
"Microsoft.SqlServer.SmoExtended ",
"Microsoft.SqlServer.SqlTDiagM ",
"Microsoft.SqlServer.SString ",
"Microsoft.SqlServer.Management.RegisteredServers ",
"Microsoft.SqlServer.Management.Sdk.Sfc ",
"Microsoft.SqlServer.SqlEnum ",
"Microsoft.SqlServer.RegSvrEnum ",
"Microsoft.SqlServer.WmiEnum ",
"Microsoft.SqlServer.ServiceBrokerEnum ",
"Microsoft.SqlServer.ConnectionInfoExtended ",
"Microsoft.SqlServer.Management.Collector ",
"Microsoft.SqlServer.Management.CollectorEnum",
"Microsoft.SqlServer.Management.Dac",
"Microsoft.SqlServer.Management.DacEnum",
"Microsoft.SqlServer.Management.Utility"


foreach ($asm in $assemblylist)
{
    $asm = [Reflection.Assembly]::LoadWithPartialName($asm)
}

Push-Location
cd $sqlpsPath
update-FormatData -prependpath SQLProvider.Format.ps1xml 
Pop-Location