2015-08-26 1 views
0

Si j'utilise sqlcmd dans un script de traitement par lots, puis-je référencer une variable de traitement par lots dans la requête?SQLCMD utilisant une variable de traitement par lots dans la requête

Alors que si je fais quelque chose comme

for /f "delims= " %%a in ('sqlcmd -S SERVER -d DATABASE -Q 
    "SELECT Column1 FROM Table1 WHERE Column1=[specific number]"') do set var1=%%a 

comment pourrais-je faire quelque chose comme ça ?:

for /f "delims= " %%b in ('sqlcmd -S SERVER -d DATABASE -Q 
    "SELECT Column2 FROM Table1 WHERE Column2=[var1]"' do set var2=%%b 

Alors que la condition WHERE dans la deuxième déclaration sqlcmd utilise l'ensemble variable la première déclaration?

Répondre

0

Change Colonne2 = [var1] pour Colonne2 =% var1%

+0

Okay donc je peux encore utiliser la même syntaxe sans discernement? – David

+0

Le% var1% sera remplacé par la valeur réelle lors de l'exécution du batch. –

+0

Ce lot a quelques problèmes que vous devez savoir. 1). Select peut renvoyer plusieurs enregistrements. La dernière valeur sera affectée à la variable. SELECT TOP 1 peut vous aider. 2). Utilisez SET NOCOUNT ON; avant l'instruction, othervise line "(1 rows affected)" sera la dernière ligne. 3). Si SELECT affecte 0 enregistrements alors la dernière ligne sera "-----------" et sera assignée à la variable. –

0

Vous pouvez passer des arguments de l'environnement à sqlcmd en utilisant le commutateur -v et référencer les paramètres dans votre instruction SQL par la syntaxe $ (variable) . Par exemple. dans votre deuxième déclaration:

for /f "delims= " %%b in ('sqlcmd -S SERVER -d DATABASE -Q 
    "SELECT Column2 FROM Table1 WHERE Column2=$(var1)" -v var1=%var1%' do set var2=%%b 
+0

Les parenthèses sont-elles autour de var1 c'est-à-dire '(var1)' partie de la syntaxe ou simplement un espace réservé? – David

+0

Ils sont en effet, la syntaxe est $ (externalVariableName) – user2955677