with start sqlserver sql sql-server powershell powershell-module

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