2010-02-24 30 views
3

有什麼辦法來檢索本地變量中的SQL查詢的結果集;該查詢將在批處理文件中運行。我想要做的是這樣的:如何將一個局部變量設置爲批處理文件中sql查詢的結果?

set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b 

varname是我的本地變量。

我在SQL相當新的所以任何幫助將不勝appreciated1

回答

2

結果寫入文件,然後讀取該文件。在你的情況下,你需要閱讀第一行(也可能是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 
  • -o ...:輸出文件(以後需要讀取)
  • -h-1:禁用頭
  • - w 9999:確保它處理正確的情況下,當您的name長於默認的80個字符時
  • SET NOCOUNT ON;SET NOCOUNT ON;在真正查詢之前禁用狀態字符串如(1 row affected)
0

您可以將結果寫入包含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% 
1

您可以使用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 
1

使用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參數)

+0

+1:很好,雖然只讀取一行,但是這已經足夠讓這個問題。 – van 2010-03-01 17:20:35

相關問題