有什麼辦法來檢索本地變量中的SQL查詢的結果集;該查詢將在批處理文件中運行。我想要做的是這樣的:如何將一個局部變量設置爲批處理文件中sql查詢的結果?
set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b
varname是我的本地變量。
我在SQL相當新的所以任何幫助將不勝appreciated1
有什麼辦法來檢索本地變量中的SQL查詢的結果集;該查詢將在批處理文件中運行。我想要做的是這樣的:如何將一個局部變量設置爲批處理文件中sql查詢的結果?
set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b
varname是我的本地變量。
我在SQL相當新的所以任何幫助將不勝appreciated1
結果寫入文件,然後讀取該文件。在你的情況下,你需要閱讀第一行(也可能是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;
SET NOCOUNT ON;
在真正查詢之前禁用狀態字符串如(1 row affected)
您可以將結果寫入包含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%
您可以使用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's答案osql
參數)
+1:很好,雖然只讀取一行,但是這已經足夠讓這個問題。 – van 2010-03-01 17:20:35