我正在通过批处理文件自动化各种 EXE,包括调用现有的批处理文件,该文件又通过 OSQL.exe 执行各种 TSQL 语句。
现有的批处理文件工作正常。但是,当我的批处理文件调用时,对 osql.exe 的调用失败,这导致批处理文件自行退出。
:check_user_privs
%OSQLPATH% %CONNECTSTRING% -S "%SERVER_INSTANCE%" -d "%DBNAME%" -Q "DECLARE @userName varchar(100) ; set @userName = user_name() ; IF IS_SRVROLEMEMBER ('sysadmin') != 1 RAISERROR ('This user ''%s'' is not a member of the ''sysadmin'' group.' , 16 , 127 , @userName )" > /nul
if errorlevel 1 (
echo ** ERROR - The user is NOT a sysadmin member on "%SERVER_INSTANCE%" - Exiting ** 1
echo.
pause
exit
)
可以说,错误发生了。使用 ECHO ON,第一行变为:
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\OSQL.EXE" -U"ADMIN" -P"PASSWORD" -S "SQL_SRVR10" -d "DB01" -Q "DECLARE @userName varchar(100) ; set @userName = user_name() ; IF IS_SRVROLEMEMBER ('sysadmin') != 1 RAISERROR ('This user ''ADMIN'' is not a member of the ''sysadmin'' group.' , 16 , 127 , @userName )" > /nul
当我直接从命令行或从我自己的批处理文件调用脚本时,这一行是相同的。
我已经手动捕获了从我的批处理文件调用此批处理文件时设置的环境变量。然后我在命令行手动设置它们,然后手动运行批处理文件。没有复制。
我将 TSQL 语句更改为简单地输出函数 IS_SRVROLEMEMBER() 的返回值。从我的脚本和命令行调用,输出都是相同的 - “1”:
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\OSQL.EXE" -U"ADMIN" -P"PASSWORD" -S "SQL_SRVR10" -d "DB01" -Q "SELECT IS_SRVROLEMEMBER ('sysadmin')"