4 votes

Passer la variable de 'list' à sqlcmd dans le fichier .bat

Cela fonctionne dans un fichier batch :

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

Mais je veux que le fichier batch boucle une liste de dates et passe chaque membre de la liste comme variable à -Q au lieu de coder la date en dur et le fichier de sortie doit également commencer par la date.

Pour une seule date, j'ai essayé

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

Mais je reçois une erreur : Incorrect syntax near the keyword 'as'

La suppression du '%' autour de inputdate donne un message d'erreur : Incorrect syntax near 'inputdate'

Et l'utilisation de @inputdate donne une erreur : Incorrect syntax near '@inputdate'

1voto

DieGraueEminenz Points 567

Peut-être que ceci pourrait aider :

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
)

Cette commande batch parcourt chaque date (une date par ligne) du fichier textfile.txt qui se trouve dans le même dossier que votre fichier .bat et exécute votre code pour chaque entrée.

1voto

LOLiCON Na Points 36

Je pense que vous pouvez essayer de définir des variables de lot comme set inputdate='2019-04-29' .

1voto

Gerhard Barnard Points 10207

Lorsque set en associant des valeurs aux variables, vous devez tenir compte de la manière dont elles sont interprétées par Windows. cmd

Exemple :

set variable = value

Cela sera interprété à partir du début de variable à la fin de value Donc, en donnant l'exemple ci-dessus, vous avez maintenant une variable de %variable % (notez les espaces à la fin) et une valeur de value (notez les espaces en tête). Si vous essayez donc de echo %variable% il retournera %variable% car la variable n'a jamais été définie, où echo %variable % retournerait une valeur, mais toujours avec l'espace en tête, ce que nous ne voulons pas.

Vous ne devez donc pas avoir d'espace entre la variable et = et aucun espace entre = et la valeur. De plus, il est préférable d'entourer toute la chaîne de la variable de guillemets doubles pour s'assurer qu'il n'y a pas d'espace à la fin de la valeur :

 set "inputdate='2019-04-29'"

0voto

user212514 Points 1

Je pense que c'est ce que vous voulez :

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

J'ai confirmé dans un fichier batch comme ceci :

set inputdate='2019-04-29'
sqlcmd -Q "print $(inputdate)" -S myserver -E

0voto

lloyd Points 878

Il vous manque peut-être les guillemets pour entourer la date. L'équivalent Powershell serait :

# 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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X