SQL批处理 - 运行不正常

时间:2016-07-26 06:26:48

标签: sql-server batch-file cmd sqlcmd

我编写了一个批处理脚本来获取特定值或从sql数据库更新值。 它仅适用于一些次,如下所示。

案例1:

  • 第一次不起作用(不更新)但返回 - 受影响的行数

  • 第二次工作(在db中更新)返回 - 受影响的行数

案例2:

有时会抛出错误(Sqlcmd:'用户名=':无效的参数。输入' - ?'寻求帮助。)

查找我的cmd错误here

请在下面找到我的脚本和sql代码。

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)'

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

参考here

<强> 1 即可。启用延迟扩展

setlocal enabledelayedexpansion

<强> 2 即可。将传递的引用从%inputUserName%更改为!inputUserName!

它有效!!