Estoy intentando ejecutar un script que ejecuta una consulta SQL. Funciona bien cuando se ejecuta en el servidor de base de datos, pero cuando intento ejecutar el mismo script en el servidor remoto, falla. Luego intenté guardar el archivo PowerShell en el servidor de base de datos y simplemente hice que el servidor remoto ejecutara ese archivo PowerShell, pero afirma que el archivo no existe.
Invoke-Command -ComputerName "advtch-db1" -ScriptBlock {
Push-Location C:\Scripts\SQL
ls -r
}
El resultado de este código muestra todo MENOS el nuevo archivo de PowerShell que acabo de crear.
Invoke-Command -ComputerName advtch-db1 -ScriptBlock {
Invoke-Sqlcmd -ServerInstance "advtch-db1" -Query "
SELECT TOP (1000) [SettingID]
,[Name]
,[Value]
,[LastUpdated]
FROM [advtch_TEST].[dbo].[Settings]
"
}
Cuando ejecuto el comando que está dentro de -ScriptBlock en el servidor de base de datos, se ejecuta bien. Pero cuando intento ejecutar en el servidor remoto aparece el siguiente error.
Database 'advtch_TEST' cannot be opened because it is offline.
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
+ PSComputerName : advtch-db1
Respuesta1
Intente solucionar problemas mediante una sesión interactiva:
PS C:\> Enter-PSSession Enter-PSSession -ComputerName "advtch-db1"
[advtch-db1]: PS C:\WINDOWS\system32> Invoke-Sqlcmd -ServerInstance "advtch-db1" -Query "My query"
Es posible que el módulo SQL no se esté cargando, o tal vez haya otros problemas que puedan aclararse de esta manera. Como referencia, aquí hay un comando que uso para el mismo propósito:
$result = Invoke-Command -ComputerName 'MySQLServer.domain.com' {
Invoke-Sqlcmd -ServerInstance '.\SQLEXPRESS' -Database MyDB -Query "SELECT strDisplayName,field1,field2,field3
FROM t_table
WHERE field1 IN (6,7,43,83,94,95,96)
ORDER BY strDisplayName"
} | select strDisplayName,field1,field2,field3
También puedes intentar conectarte usandosqlcmd.exedesde su máquina local, aunque esto solo devolverá cadenas en lugar de objetos. Lo suficientemente bueno para informes y cosas así:
sqlcmd.exe -S myServer\instanceName