2016-07-26 1 views
0

J'ai écrit un script batch pour obtenir une valeur particulière ou mettre à jour des valeurs depuis la base de données sql. Il fonctionne seulement pour fois fois, énumérés ci-dessous.SQL par lot - Ne fonctionne pas bien

Cas 1:

  • Première ne fonctionne (pas mis à jour), mais renvoie - 1 lignes affectées

  • La deuxième fois, il fonctionne (mise à jour bien db) retourne - 1 lignes affectées

cas n ° 2:

parfois lancé une erreur (Sqlcmd: 'username =': argument non valide. Entrer '-?' pour obtenir de l'aide.)

Rechercher l'erreur cmd here.

Veuillez trouver mon script et le code SQL ci-dessous.

main.bat

@ECHO OFF 

:: DB Properties 
SET dbPath=XXXX 
SET dbUsername=YYYY 
SET dbPassword=ZZZZ 
SET dataBaseName=KKKK 

:: SQL Properties 
SET originId=50 

ECHO DB NAME - %dataBaseName% 

ECHO Select an option 
ECHO 1.Token 
ECHO 2.Activate 

SET /P option=Enter an option: 

IF "%option%"=="1" (SET /P inputUserName=Enter username: 
    sqlcmd -S %dbPath% -U %dbUsername% -P %dbPassword% -i token.sql -v dbName=%dataBaseName% username=%inputUserName%) 

IF "%option%"=="2" (SET /P inputUserName=Enter username: 
    sqlcmd -S %dbPath% -U %dbUsername% -P %dbPassword% -i update.sql -v dbName=%dataBaseName% username=%inputUserName% orgId=%originId%) 

ECHO Executed Successfully ..!! 

::PAUSE 

token.sql

use $(dbName); 

select VerificationCode from users where username = '$(username)' 

update.sql

use $(dbName); 

UPDATE users 
SET passwordHash = (SELECT PasswordHash FROM users WHERE userid = $(orgId)), 
    passwordsalt = (SELECT passwordsalt FROM users WHERE userid = $(orgId)), 
    isActive = 1, 
    emailConfirmed = 1 
WHERE username = '$(username)' 

Comment résoudre ce problème?

+2

"Ne fonctionne pas la première fois, mais la seconde fois" est généralement un indice d'un [problème d'expansion différée] (http://stackoverflow.com/a/30284028/2152082) (il y a deux 'if' blocs où ce problème se produit) – Stephan

+0

Merci @Stephan. Cela fonctionne et a une bonne explication :-) –

+0

Ne changez pas votre question si vous avez résolu votre problème. Ajoutez une réponse à la solution et acceptez cette réponse. –

Répondre

0

Référence here

. Activer l'expansion retardée

setlocal enabledelayedexpansion 

. Changez la référence passée de % inputUserName% à ! InputUserName!

Cela fonctionne !!

+0

Bien que ce soit la bonne réponse à votre question, pourquoi ne pas 'set/p inputUserName = Entrer le nom d'utilisateur:' une fois après l'option 'SET/P = Entrer une option:' et ensuite juste si "% option%" = = "1" sqlcmd ... 'et' si "% option%" == "2" sqlcmd ... '? – Stephan