我通過批處理文件自動執行各種EXE,包括調用現有的批處理文件,然後通過OSQL.exe執行各種TSQL語句。從批處理文件調用的批處理文件中調用OSQL中的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
此行是相同的,當我直接在命令行或從我自己的批處理文件調用腳本。
我手動捕獲了從批處理文件調用此批處理文件時設置的環境變量。然後我在命令行手動設置它們,然後手動運行該批處理文件。沒有repro。
我改變了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')"
我認爲你是對的'延遲擴展'。總是一個好主意,沒有它的工作,因爲副作用,我這樣做 – Endoro
但它是*所以*有用!:-) –