SQLCMD

2012-05-03 22 views
11

मैं जब मैं एक डॉस बैच फ़ाइल में इसे चलाने के एक एसक्यूएल बयान के मूल्य प्राप्त करने की कोशिश कर रहा हूँ में एक एसक्यूएल बयान के दिए गए मान पहुंच रहा है ...SQLCMD

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

मैं के बाद नहीं कर रहा हूँ इस stackoverflow प्रश्न में त्रुटि स्तर, बल्कि मैं डेटाबेस से वास्तविक गिनती के बाद हूं, इसलिए मैं कुछ अतिरिक्त तर्क कर सकता हूं।

उत्तर

12

आप -o sqlcmd ध्वज या मानक > पुनर्निर्देशक का उपयोग कर निष्पादन के परिणाम को आसानी से सहेज सकते हैं। इसके बाद आप कॉलम हेडर (ध्वज -h) को हटाकर और SQL सर्वर (SET NOCOUNT ON) से पंक्ति गणना को हटाकर इस फ़ाइल को प्रारूपित कर सकते हैं।

निम्न स्क्रिप्ट COUNT(1) का ही मूल्य और एक लाइन ब्रेक के साथ एक फ़ाइल result.txt उत्पन्न करेगा:

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

आंशिक रूप से ... मैं मूल्य को वापस डॉस बैच फ़ाइल में कैसे प्राप्त करूं? – SteveC

+1

तो शायद @ Christian.K समाधान (FOR का उपयोग करके) आपको बेहतर तरीके से उपयुक्त कर सकता है, क्योंकि यह कमांड के परिणाम का मूल्यांकन करेगा और फिर आप बैच वैरिएबल को असाइन कर सकते हैं, आपको खाली स्ट्रिंग से बचने के लिए केवल एक सरल परीक्षण जोड़ना होगा। –

12

आप बच सकते हैं sqlcmd.exeFOR बैच कमांड का उपयोग करके 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 का उपयोग किया, यह दिखाने के लिए कि आपको डबल कोट्स में संपूर्ण "सर्वर, पोर्ट" विनिर्देश डालना होगा। अन्यथा, सीएमडी के कमांड लाइन पार्सिंग नियमों के कारण, sqlcmd अलग-अलग तर्कों के रूप में सर्वर और पोर्ट को देखेगा और विफल हो जाएगा।
4

@ गेरार्डोलिमा का उत्तर वहां से 9 0% था। अग्रणी व्हाइटस्पेस को पट्टी करने के लिए आपको 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'