[英]How to set a local variable to the result of sql query in a batch file?
有沒有辦法在局部變量中檢索sql查詢的結果集; 查詢將在批處理文件中運行。 我想要做的是這樣的事情:
set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b
varname是我的本地變量。
我是新的sql所以任何幫助將非常感激1
將結果寫入文件,然后讀取文件。 在您的情況下,您需要閱讀第一行(並可能trim
它)。
在查詢中添加以下參數:
osql -S%dstserver% -d%dstDB% -Q"SET NOCOUNT ON;SELECT name from table_name where Id = %siteId%" %osqluser% -b -w 9999 -h-1 -o tempres.txt
name
超過默認值80個字符時正確處理 SET NOCOUNT ON;
在真正的查詢之前禁用狀態字符串(1 row affected)
您可以使用for /f
迭代命令的輸出:
for /f "usebackq delims=" %%x in (`your command`) do ...
您根本不需要臨時文件; 它不會在這里獲得任何東西(除了必須考慮你可能有寫權限的地方,並記得之后刪除文件)。
for
輸出的逐行迭代,隨着標記化。 這就是為什么在最后有一個delims=
有效地禁用任何標記,所以你不會在空格處得到你的輸出。 還有其他選項,例如skip=n
,它將在開始處理之前跳過n行,您可以使用它忽略標題左右。
在該循環內,您可以執行以下操作:
for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x
但是,要非常小心你之后使用該變量做什么,因為它可能包含shell視為特殊的字符,例如>
, <
, &
等等。當你做類似的事情時,你可能會在這里創建一些批處理注入漏洞。以下:
echo %VAR%
有人決定在他的名字中加上以下字符串:
foo & rd /s q \
如果你知道只有一行有可用內容返回而其余部分是無用的垃圾那么你可以過早地打破循環:
for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x&goto break
:break
使用set /p
:
osql -S%dstserver% -d%dstDB% -Q"SET NOCOUNT ON;SELECT name from table_name where Id = %siteId%" %osqluser% -b -w 9999 -h-1 -o tempres.txt
set /p varname=<tempres.txt
(借用van的答案借用osql
參數)
您可以將結果寫入包含set
語句的文件。
@echo off
osql -E -S servername -h-1 -Q "set nocount on; select 'set var=42'" > c:\set.bat
call c:\set.bat
echo %VAR%
這導致42
被寫入屏幕。 要從表中選擇名稱,請使用以下SQL語句:
select 'set var=' + name from table_name where Id = %siteId%
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.