start - sqlserver powershell
¿Cómo se ejecuta el archivo.sql usando powershell? (5)
Tengo un . archivo sql
. Estoy tratando de pasar los detalles de la cadena de conexión a través de un script de Powershell e invocar un archivo .sql
.
Estaba buscando y se me ocurrió un cmdlet relacionado con Invoke-sqlcmd
. Mientras intentaba encontrar un módulo correspondiente a SQL, no encontré ninguno en mi máquina.
¿Debo instalar algo en mi máquina (la máquina ya tiene SQL Server Management Studio 2008 R2) para obtener los módulos o hay alguna manera fácil de ejecutar archivos .sql
usando Powershell?
Aquí hay una función que tengo en mi perfil de PowerShell para cargar snapins SQL:
function Load-SQL-Server-Snap-Ins
{
try
{
$sqlpsreg="HKLM:/SOFTWARE/Microsoft/PowerShell/1/ShellIds/Microsoft.SqlServer.Management.PowerShell.sqlps"
if (!(Test-Path $sqlpsreg -ErrorAction "SilentlyContinue"))
{
throw "SQL Server Powershell is not installed yet (part of SQLServer installation)."
}
$item = Get-ItemProperty $sqlpsreg
$sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
$assemblyList = @(
"Microsoft.SqlServer.Smo",
"Microsoft.SqlServer.SmoExtended",
"Microsoft.SqlServer.Dmf",
"Microsoft.SqlServer.WmiEnum",
"Microsoft.SqlServer.SqlWmiManagement",
"Microsoft.SqlServer.ConnectionInfo ",
"Microsoft.SqlServer.Management.RegisteredServers",
"Microsoft.SqlServer.Management.Sdk.Sfc",
"Microsoft.SqlServer.SqlEnum",
"Microsoft.SqlServer.RegSvrEnum",
"Microsoft.SqlServer.ServiceBrokerEnum",
"Microsoft.SqlServer.ConnectionInfoExtended",
"Microsoft.SqlServer.Management.Collector",
"Microsoft.SqlServer.Management.CollectorEnum"
)
foreach ($assembly in $assemblyList)
{
$assembly = [System.Reflection.Assembly]::LoadWithPartialName($assembly)
if ($assembly -eq $null)
{ Write-Host "`t`t($MyInvocation.InvocationName): Could not load $assembly" }
}
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
Push-Location
if ((Get-PSSnapin -Name SqlServerProviderSnapin100 -ErrorAction SilentlyContinue) -eq $null)
{
cd $sqlpsPath
Add-PsSnapin SqlServerProviderSnapin100 -ErrorAction Stop
Add-PsSnapin SqlServerCmdletSnapin100 -ErrorAction Stop
Update-TypeData -PrependPath SQLProvider.Types.ps1xml
Update-FormatData -PrependPath SQLProvider.Format.ps1xml
}
}
catch
{
Write-Host "`t`t$($MyInvocation.InvocationName): $_"
}
finally
{
Pop-Location
}
}
Citando desde importar el módulo de SQLPS en MSDN,
La forma recomendada de administrar SQL Server desde PowerShell es importar el módulo sqlps a un entorno Windows PowerShell 2.0.
Entonces, sí, podría usar el enfoque Add-PSSnapin
detallado por Christian, pero también es útil para apreciar el enfoque del módulo sqlps recomendado.
El caso más simple supone que tiene SQL Server 2012: sqlps está incluido en la instalación, por lo que simplemente carga el módulo como cualquier otro (normalmente en su profile ) a través de Import-Module sqlps
. Puede verificar si el módulo está disponible en su sistema con Get-Module -ListAvailable
.
Si no tiene SQL Server 2012, todo lo que necesita hacer es descargar el módulo sqlps en su directorio de módulos para que Get-Module / Import-Module lo encuentre. Curiosamente, Microsoft no hace que este módulo esté disponible para su descarga. Sin embargo, Chad Miller amablemente ha empaquetado las piezas necesarias y ha proporcionado la descarga de este módulo . Descomprímala debajo de su ... Directorio de Documentos / WindowsPowerShell / Módulos y proceda con la importación.
Es interesante observar que el enfoque del módulo y el enfoque snapin no son idénticos. Si carga los snapins luego ejecuta Get-PSSnapin
( sin el parámetro -Registered, para mostrar solo lo que ha cargado), verá los snapins de SQL. Si, por otro lado, carga el módulo sqlps Get-PSSnapin
no mostrará los snapins cargados, por lo que las diversas entradas de blog que prueban el cmdlet Invoke-Sqlcmd
examinando solo snapins podrían dar un resultado falso negativo.
Actualización 2012.10.06
Para obtener la historia completa del módulo sqlps frente a los complementos sqlps mini-shell vs. SQL Server, eche un vistazo a mi miniserie de dos partes Practical PowerShell para desarrolladores de SQL Server y DBA publicados recientemente en Simple-Talk.com donde, según el comentario de un lector, he logrado "confundir" el problema. :-)
Intente ver si hay complementos de SQL presentes:
get-pssnapin -Registered
Name : SqlServerCmdletSnapin100
PSVersion : 2.0
Description : This is a PowerShell snap-in that includes various SQL Server cmdlets.
Name : SqlServerProviderSnapin100
PSVersion : 2.0
Description : SQL Server Provider
Si es así
Add-PSSnapin SqlServerCmdletSnapin100 # here lives Invoke-SqlCmd
Add-PSSnapin SqlServerProviderSnapin100
entonces puedes hacer algo como esto:
invoke-sqlcmd -inputfile "c:/mysqlfile.sql" -serverinstance "servername/serverinstance" -database "mydatabase" # the parameter -database can be omitted based on what your sql script does.
con 2008 Server 2008 y 2008 R2
Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100
con 2012 y 2014
Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location
if(Test-Path "C:/Program Files/Microsoft SQL Server/MSSQL11.SQLEXPRESS") { #Sql Server 2012
Import-Module SqlPs -DisableNameChecking
C: # Switch back from SqlServer
} else { #Sql Server 2008
Add-PSSnapin SqlServerCmdletSnapin100 # here live Invoke-SqlCmd
}
Invoke-Sqlcmd -InputFile "MySqlScript.sql" -ServerInstance "Database name" -ErrorAction ''Stop'' -Verbose -QueryTimeout 1800 # 30min