2012-05-03 14 views
11

我想,當我在DOS批處理文件運行它得到一個SQL語句的值...訪問SQL語句的返回值在SQLCMD

sqlcmd -E -S DEVSERVER -Q "SELECT COUNT(1) as [CaseCount] FROM Cases" 

我不後錯誤級別在這個stackoverflow問題中,而是在從數據庫返回的實際計數之後,所以我可以做一些額外的邏輯。

回答

12

通過使用-o sqlcmd標誌或使用標準>重定向器,可以輕鬆地將執行結果保存到文本文件中。然後可以通過刪除列標題(標誌-h)並從SQL Server中刪除行數(SET NOCOUNT ON)來格式化此文件。

下面的腳本將生成一個文件result.txtCOUNT(1)只值和換行符:

SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 
    > result.txt 

然後用...讀值回

set /p value=< result.txt 
echo %value% 
+0

+1剛看到,張貼我的答案,你的還包括'-h後 - 1'選項。 –

+1

部分...我如何將值返回到DOS批處理文件? – SteveC

+1

然後@ Christian.K解決方案(使用FOR)可能更適合你,因爲它會評估命令的結果,然後你可以分配給一個批處理變量,你只需要添加一個簡單的測試來避免空字符串。 –

12

你能避免通過使用FOR批命令調用sqlcmd.exe

for /F usebackq %%i in (`sqlcmd -E -S "devserver,4711" -h-1 -Q "SET NOCOUNT ON; SELECT COUNT(1) ..."`) do (
    set count=%%i 
) 

if not defined count (
    echo Failed to execute SQL statement 1>&2 
) else (
    echo %count% 
) 

一些注意事項:

  • 如果從交互CMD.EXE會議要求,即在命令行中,使用的%%i%i代替
  • -h-1選項告訴sqlcmd.exe打壓列標題,所以輸出是唯一真正一行文字。
  • 我在服務器上使用了一個虛構的端口4711,以表明您需要將整個「服務器,端口」規範放在雙引號中。否則,由於CMD的命令行解析規則,sqlcmd將看到服務器和端口的不同參數並失敗。
4

來自@GerardoLima的答案是那裏的90%。您還需要使用set /a評估輸入值以去除前導空格。

這不是必需的答案來自@ Christian.K

SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 > result.txt 
set /p raw=< result.txt 
echo '%raw%' 
set /a value=%raw% 
echo '%value%' 

我的產量

'   0' 
'0'