Esto funciona en un archivo por lotes:

sqlcmd -Q "exec sp_mysp @refdate = '2019-04-29'" -S myserver -d mydb -o C:\myfolder\result.csv

Pero quiero que el archivo por lotes recorra una lista de fechas y pase cada miembro de la lista como variable a -Q en lugar de codificar la fecha y el archivo de salida también debe comenzar con la fecha.

Por una sola fecha he intentado

set inputdate = '2019-04-29'
set "outputfile=C:\myfolder\%inputdate%_result.csv"
sqlcmd -Q "exec sp_mysp @refdate = try_cast(%inputdate% as date) " -S myserver -d mydb -o outputfile

Pero obteniendo error: Incorrect syntax near the keyword 'as'

Eliminar el '%' alrededor de inputdate da un mensaje de error: Incorrect syntax near 'inputdate'

Y usar @inputdate da error: Incorrect syntax near '@inputdate'

4
shanlodh 10 may. 2019 a las 09:37

5 respuestas

La mejor respuesta

Cuando set ting variables con valores, debe considerar cómo es interpretado por Windows cmd

Ejemplo:

set variable = value

Esto se interpretará desde el comienzo de variable hasta el final de value Por lo tanto, dando el ejemplo anterior, ahora tiene una variable de %variable % (observe el espacio en blanco final) y un valor de {{ X3}} (tenga en cuenta el espacio en blanco inicial). Por lo tanto, si intenta echo %variable%, devolverá %variable% ya que la variable nunca se configuró, donde echo %variable % devolvería un valor, pero aún con el espacio inicial que no queremos.

Por lo tanto, no debe tener espacios entre la variable y = ni espacios en blanco entre = y el valor. Además, es mejor ajustar toda la cadena variable entre comillas dobles para asegurarse de que no tiene espacios en blanco al final del valor, por lo que, finalmente, deberá hacer lo siguiente:

 set "inputdate='2019-04-29'"
1
Gerhard Barnard 10 may. 2019 a las 07:40

Quizás esto ayude:

IF exist inputfile.txt FOR /F "eol=# delims=" %%V IN (inputfile.txt) DO ( 
set "outputfile=C:\myfolder\%%V_result.csv"
sqlcmd -Q "exec sp_mysp @refdate = try_cast(%%V as date) " -S myserver -d mydb -o outputfile
)

Este comando por lotes recorre cada fecha (una fecha por línea) desde el archivo de texto.txt que se encuentra en la misma carpeta que su archivo .bat y ejecuta su código para cada entrada.

1
DieGraueEminenz 4 jun. 2019 a las 04:41

Creo que esto es lo que quieres:

set inputdate = '2019-04-29'
set "outputfile=C:\myfolder\%inputdate%_result.csv"
sqlcmd -Q "exec sp_mysp @refdate = try_cast($(inputdate) as date) " -S myserver -d mydb -o outputfile

Confirmé en un archivo por lotes como este:

set inputdate='2019-04-29'
sqlcmd -Q "print $(inputdate)" -S myserver -E
0
Gerhard Barnard 14 may. 2019 a las 13:32

Es posible que le falten las comillas dobles para incluir la fecha. El equivalente de Powershell sería:

# Dates
$dates = @(
    '2019-04-29'
)

$dates  | ForEach-Object {
    # Date
    $inputdate = $_
    # Command to run
    $cmd = "DECLARE @refdate as datetime; set @refdate = try_cast ('$inputdate' as date) ; exec sp_mysp @refdate " 

    $args = @( 
        '-Q'
        $cmd    
        '-S'
        'myserver'
        '-d'
        'mydb'
        '-o' 
        'outputfile'
    )
    Write-Host "Running : $cmd "
    & 'sqlcmd' $args
}
0
Gerhard Barnard 14 may. 2019 a las 13:33

Creo que puede intentar establecer variables de lote como set inputdate='2019-04-29'.

1
Gerhard Barnard 10 may. 2019 a las 07:32