2012-03-15 20 views
13

Tengo una cadena en powershell, que contiene un comando nativo sqlcmd. El comando en sí mismo se puede ejecutar con éxito en cmd.exe. Tengo dificultades para ejecutarlos en PowerShell. Cualquiera puede ayudar? Gracias.¿Cómo ejecutar sqlcmd desde powershell?

Ésta es sql.sql

select @@servername 
go 
select @@servicename 

Este es el resultado cuando ejecuto el comando sqlcmd de cmd.exe

C:\Users\test>sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 

-------------------------------------------------- 
thesimpsons\INSTANCE1 

(1 rows affected) 

-------------------------------------------------- 
INSTANCE1 

(1 rows affected) 

C:\Users\test> 

Este es el script de PowerShell para llamar al comando sqlcmd.

$sql = @" 
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 
"@ 

Invoke-Command $sql 

Cuando ejecuto este script de powershell, recibo el siguiente error.

PS C:\TEMP> $sql = @" 
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 
"@ 

Invoke-Command $sql 
Invoke-Command : Parameter set cannot be resolved using the specified named parame 
ters. 
At line:5 char:15 
+ Invoke-Command <<<< $sql 
    + CategoryInfo   : InvalidArgument: (:) [Invoke-Command], ParameterBin 
    dingException 
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands 
    .InvokeCommandCommand 
+0

relacionados: http://stackoverflow.com/questions/1015038/powershell-sqlcmd –

Respuesta

18

Para llamar a un ejecutable Win32 desea utilizar el operador de llamada & así:

& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 
3

Uso Invoke-Expression en lugar de Invoke-Command

+0

No veo por qué la gente trata usar Invoke-Expression al llamar ejecutables de Win32 ... Esto es para lo que es el operador de llamadas. –

+0

@Andy - Invocar-Expresión le permite generar el comando completo como una cadena primero, lo que podría ser útil dependiendo de las circunstancias. Ver http://stackoverflow.com/questions/6604089/dynamically-generate-command-line-command-then-invoke-using-powershell –

+1

Sí, pero eso no está sucediendo aquí. Solo use Invoke-Expression cuando hay una expresión que necesita ser evaluada. –

5

Ésta es la forma en que construyo algunos aspectos externos de mando en mis guiones

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>` 
           -U a ` 
           -P a ` 
           -i `"c:\temp\sql.sql`" } 
Invoke-Command -ScriptBlock $scriptBlock 

Puede th en uso $ args variable dentro de él e incluso iniciarlo remotamente.

$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>` 
           -U a ` 
           -P a ` 
           -i `"$($args[0])`" } 
Invoke-Command -ScriptBlock $scriptBlock -argumentList "c:\temp\sql.sql" -computer "remote1" 

Observación:

Esto permite a comentar cada parámetro.

Tenga cuidado de no olvidar un "` "y sin espacio después de ellos, donde se encuentran al final de la línea.

2

El primer parámetro posicional de invoke-command es -scriptblock, y espera un argumento de bloque de script. Para aprovechar las ventajas de una cadena multilínea para construir el comando y luego ejecutarlo con Invoke-Command, es necesario convertir el aquí-cadena en un bloque de script:

$sql = @" 
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql" 
"@ 

Invoke-Command ([scriptblock]::create($sql)) 
+0

Todo esto va a hacer es devolver el valor en $ sql, en realidad no lo ejecutará (al menos no en mi máquina). –

+0

Tienes razón. Actualizaré esa respuesta. – mjolinor

13

También podría dejar de usar el exterior 'SQLCMD .EXE' y utilizar el Invoke-Sqlcmd cmdlet lugar:

Invoke-Sqlcmd es un cmdlet de SQL Server que se ejecuta las secuencias de comandos que contienen declaraciones de los idiomas (Transact-SQL y XQuery) y los comandos que son compatibles con la utilidad sqlcmd

Sólo tiene que abrir la utilidad '' y ejecutar sqlps

Invoke-Sqlcmd -InputFile "C:\temp\sql.sql" 

favor ver Running SQL Server PowerShell

También puede cargar los complementos de SQL Server manualmente en PowerShell antes de usar 'Invoke-Sqlcmd';
para MS SQL Server 2012 puede hacerlo mediante la ejecución de
Import-Module SqlPs

+1

Si bien la respuesta de Andi Arismendi es buena, y responde directamente la ejecución del archivo ejecutable sqlcmd, creo que esta debería ser la respuesta aceptada. Si está ejecutando scripts sqlcmd a través de powershell, le ahorrará tiempo, esfuerzo y pulsaciones de teclado para simplemente usar Invoke-Sqlcmd. – ascary

+4

1. Invoke-Sqlcmd no implementa todos los comandos que están disponibles con SQLCMD. 2. Invoke-Sqlcmd no está incluido en la instalación base de Powershell – DonBecker

+0

Invoke-Sqlcmd agrega un punto y coma al final de los procedimientos almacenados, lo que causa problemas con las herramientas de comparación. Consulte https://social.msdn.microsoft.com/Forums/sqlserver/en-US/74d8acd4-9788-48e5-93bc-fa165a573ee2/powershell-invokesqlcmd-adding-semicolon?forum=sqltools y https: //www.reddit .com/r/PowerShell/comments/5v29o2/options_for_executing_sql_server_script/ – kevinpo

0

Tanto nombre de instancia y nombre de usuario deben ser plenamente cualificado

<domain_name>\Instanc_name y <domai_name>\Username. Solo el nombre de su instancia está correctamente escrito.

0

Esto es lo que funcionó para mí para utilizar sqlcmd desde el script de PowerShell usando el operador &, ver ejemplo para generar un archivo csv:

& cmd/c "sqlcmd -S $ sv -i $ PROCFILE -s, -v varDB = $ $ dbclean -o nombre de archivo"

$sv tiene como nombre del servidor SERVERNAME\INSTANCE

$PROCFILE es como d:\TSTSQL\Sqlquery.SQL

$filename es d:\TSTSQL\Desiredoutfilename.CSV

$dbclean es un parámetro que recibe el archivo sql

Cuestiones relacionadas