Sqlcmd को .sql स्क्रिप्ट विफल होने पर 0 के अलावा कोई ERRORLEVEL कैसे लौटाया जाए?


38

मैं एक बैच फ़ाइल से sqlcmd चला रहा हूं और मैं सोच रहा था कि बैकअप के साथ कुछ गलत होने पर इसे 0 के अलावा एक ERRORLEVEL कैसे लौटाया जाए।


क्या आपने बैच फ़ाइलों की तुलना में कुछ अधिक मजबूत (विशेष रूप से त्रुटि से निपटने पर) का उपयोग करने पर विचार किया है?
हारून बर्ट्रेंड

ओह आपका मतलब पॉवर्सशेल जैसा है? हम सिर्फ उस उत्पाद के लिए कंपनी की अनुशंसित पद्धति के साथ जा रहे थे जिसका हम उपयोग कर रहे हैं। मुसीबत यह है कि आप एक डेटाबेस का समर्थन कर रहे हैं विधि की सिफारिश की है; लेकिन मैंने उस बाधा को पार कर लिया है। यदि बैकअप काम नहीं करता है, तो बस इसे एक त्रुटि कोड फेंकने के लिए कोई रास्ता नहीं है?
leeand00

3
यह मेरे लायक काम के लायक है, हम सैकड़ों सर्वरों के हजारों डेटाबेसों का बैकअप लेने के लिए ओला हैलेनग्रेन की बैकअप संग्रहीत प्रक्रियाओं (उनके आसपास कुछ इन-हाउस रैपर संग्रहीत प्रक्रियाओं के साथ) का उपयोग करते हैं, और हमें उनसे कोई समस्या नहीं है।
जेम्स एल

जवाबों:


53

आपको sqlcmd में विकल्प -b का उपयोग करना चाहिए।

-b निर्दिष्ट करता है कि कोई त्रुटि उत्पन्न होने पर sqlcmd बाहर निकलता है और DOS ERRORLEVEL मान लौटाता है। DOS ERRORLEVEL चर पर लौटाया गया मान 1 है जब SQL सर्वर त्रुटि संदेश में 10 से अधिक गंभीरता स्तर होता है; अन्यथा, दिया गया मान 0 है

http://msdn.microsoft.com/en-us/library/ms162773.aspx


9

MSDN SQLCMD सुविधा पृष्ठ से: http://msdn.microsoft.com/en-us/library/ms1627.nx

यदि RAISERROR का उपयोग एक sqlcmd स्क्रिप्ट के भीतर किया जाता है और 127 की स्थिति को उठाया जाता है, तो sqlcmd ग्राहक को संदेश आईडी वापस छोड़ देगा और वापस कर देगा। उदाहरण के लिए:

RAISERROR (50001, 10, 127)

तो आप BACKUP DATABASE...कमांड को एक TRY...CATCHब्लॉक में लपेट सकते हैं और उपयुक्त त्रुटि संदेश बढ़ा सकते हैं, जो sqlcmdतब आपकी बैच फ़ाइल में वापस आ जाएगा।

उदाहरण के लिए, निम्नलिखित errorleveltest.sqlफ़ाइल पर विचार करें :

:ON ERROR EXIT
BEGIN TRY
    /* creates error 3147 Backup and restore operations 
            are not allowed on database tempdb */
    BACKUP DATABASE tempdb; 
END TRY
BEGIN CATCH
    DECLARE @msg NVARCHAR(255);
    SET @msg = 'An error occurred: ' + ERROR_MESSAGE();
    RAISERROR (50002, 10, 127);
END CATCH

और निम्नलिखित .bat फ़ाइल: (पहली पंक्ति पठनीयता के लिए लिपटी हुई है, लेकिन एक ही पंक्ति में होनी चाहिए।)

@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S "someinstance" -E 
    -i .\errorleveltest.sql
ECHO Errorlevel: %ERRORLEVEL%

यह मेरे cmd.exe प्रॉम्प्ट से निम्नलिखित देता है:

Msg 18054, Level 16, State 1, Server CP708-D377\MV, Line 9
Error 50002, severity 10, state 127 was raised, but no message with that error number 
was found in sys.messages. If error is larger than 50000, make sure the user-defined 
message is added using sp_addmessage.
Errorlevel: 1

जैसा कि आप देख सकते हैं, ERRORLEVEL 1 को सामान्य वापसी मान के बजाय 0. लौटाया गया है। मैं वास्तविक त्रुटि संख्या को प्रतिबिंबित करने के लिए ERRORLEVEL प्राप्त करने में असमर्थ हूं, इस मामले में 50002; शायद मेरे कोड में कोई समस्या है, या शायद मेरे पर्यावरण के साथ कुछ समस्या है।


1
मैंने पाया है कि यह केवल तभी काम करता है जब आप RAISERROR के पहले पैरामीटर के रूप में एक संख्यात्मक मूल्य की आपूर्ति करते हैं। उदाहरण के लिए: यह% errorlevel% = 1: RAISERROR (50002, 10,127) देता है, लेकिन यह% errorlevel% = 0: RAISERROR ('myErrMsg।, 10,127) देता है

5
पिछले पैराग्राफ के संबंध में FYI करें: ERRORLEVELSQL सर्वर से रिपोर्ट की गई त्रुटि संख्या के समान मान होने की उम्मीद नहीं की जानी चाहिए। ErrorNumber एक SQL सर्वर-विशिष्ट मान है जो यह बताता है कि यह (यानी SQL सर्वर) समाप्त क्यों हुआ। दूसरी ओर, ERRORLEVELयह बताने के लिए कि यह (यानी SQLCMD) समाप्त करने के लिए SQLCMD- विशिष्ट मान है।
सोलोमन रटज़की 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.