2012-05-03 23 views
11

Tôi đang cố gắng để có được giá trị của một câu lệnh SQL khi tôi chạy nó trong một tập tin batch DOS ...Tiếp cận giá trị trả về của một câu lệnh SQL trong SQLCMD

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

Tôi không sau mức độ lỗi như trong câu hỏi stackoverflow này, thay vì tôi sau khi đếm thực tế được trả về từ cơ sở dữ liệu, vì vậy tôi có thể thực hiện thêm một số logic.

Trả lời

12

Bạn có thể dễ dàng lưu kết quả thực thi vào tệp văn bản, bằng cách sử dụng cờ -o sqlcmd hoặc bằng cách sử dụng trình chuyển hướng chuẩn >. Sau đó, bạn có thể định dạng tệp này bằng cách xóa tiêu đề cột (cờ -h) và xóa số lượng hàng từ SQL Server (SET NOCOUNT ON).

Các kịch bản sau đây sẽ tạo ra một file result.txt chỉ với giá trị của COUNT(1) và ngắt dòng:

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

Và sau đó đọc giá trị trở lại với ...

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

+1 Chỉ cần thấy, sau khi công bố câu trả lời của tôi rằng của bạn cũng bao gồm các '-h - 1' tùy chọn. –

+1

Một phần ... làm cách nào để lấy lại giá trị vào tệp lô DOS? – SteveC

+1

Sau đó có thể giải pháp @ Christian.K (sử dụng FOR) có thể phù hợp với bạn hơn, vì nó sẽ đánh giá kết quả của lệnh và sau đó bạn có thể gán cho biến hàng loạt, bạn chỉ cần thêm một thử nghiệm đơn giản để tránh chuỗi rỗng. –

12

Bạn có thể tránh tệp bổ sung/tạm thời, bằng cách gọi sqlcmd.exe bằng lệnh FOR lô:

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

Một số lưu ý:

  • Nếu gọi từ một CMD.EXE phiên tương tác, tức là dòng lệnh, sử dụng %i thay vì %%i
  • Tùy chọn -h-1 nói sqlcmd.exe để ngăn chặn các tiêu đề cột, vì vậy sản lượng chỉ thực sự là một dòng văn bản.
  • Tôi đã sử dụng cổng hư cấu 4711 với máy chủ, để cho thấy rằng bạn cần đặt toàn bộ thông số "máy chủ, cổng" trong dấu ngoặc kép. Nếu không, do quy tắc phân tích cú pháp dòng lệnh của CMD, sqlcmd sẽ thấy máy chủ và cổng là đối số riêng biệt và không thành công.
4

Câu trả lời từ @GerardoLima là 90% trong số đó. Bạn cũng cần phải đánh giá giá trị đầu vào với set /a để loại bỏ khoảng trắng hàng đầu.

này là không cần thiết với câu trả lời từ @ 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%' 

đầu ra của tôi là

'   0' 
'0'