2012-05-03 10 views
11

Próbuję uzyskać wartość instrukcji SQL, gdy uruchomię go w pliku wsadowym DOS ...Dostęp wracającą wartość SQL w Sqlcmd

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

Nie jestem po poziom błędu jak w tym pytaniu stackoverflow, raczej jestem po faktycznej liczbie zwróconych z bazy danych, więc mogę zrobić dodatkową logikę.

Odpowiedz

12

Możesz łatwo zapisać wynik wykonania w pliku tekstowym, używając flagi sqlcmd -o lub standardowego readresatora >. Następnie można sformatować ten plik, usuwając nagłówek kolumny (flag -h) i usuwając liczbę wierszy z serwera SQL Server (SET NOCOUNT ON).

Poniższy skrypt wygeneruje plik result.txt tylko wartości COUNT(1) i koniec linii:

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

a następnie odczytać wartość z powrotem ...

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

+1 Właśnie zobaczyłem, po zaksięgowaniu moją odpowiedź, że obejmuje również '-h - Opcja 1'. –

+1

Po części ... jak mogę odzyskać wartość z pliku wsadowego DOS? – SteveC

+1

Wtedy może rozwiązanie @ Christian.K (używając FOR) może lepiej Ci pasować, ponieważ oceni wynik polecenia, a następnie możesz przypisać do zmiennej wsadowej, wystarczy dodać prosty test, aby uniknąć pustego ciągu. –

12

można uniknąć dodatkowy/tymczasowy plik, wywołując sqlcmd.exe przy użyciu polecenia wsadowego FOR:

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% 
) 

Kilka uwag:

  • Jeśli wywołana z interaktywnym CMD.EXE sesji, czyli linii poleceń, należy użyć %i zamiast %%i
  • Opcja -h-1 mówi sqlcmd.exe stłumić nagłówki kolumn, więc wyjście jest naprawdę tylko jedna linia tekstu.
  • Użyłem fikcyjnego portu 4711 z serwerem, aby pokazać, że musisz podać całą specyfikację "serwer, port" w podwójnym cudzysłowie. W przeciwnym razie, z powodu reguł parsowania wiersza poleceń CMD, sqlcmd zobaczy serwer i port pod względem różnych argumentów i nie powiedzie się.
4

Odpowiedź od @GerardoLima wynosiła 90% drogi. Dodatkowo należy ocenić wartość wejściową za pomocą set /a, aby usunąć początkowe białe znaki.

Nie jest to wymagane z odpowiedzią od @ 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%' 

moje wyjście było

'   0' 
'0' 
Powiązane problemy