मैं एक बैच फ़ाइल से sqlcmd चला रहा हूं और मैं सोच रहा था कि बैकअप के साथ कुछ गलत होने पर इसे 0 के अलावा एक ERRORLEVEL कैसे लौटाया जाए।
मैं एक बैच फ़ाइल से sqlcmd चला रहा हूं और मैं सोच रहा था कि बैकअप के साथ कुछ गलत होने पर इसे 0 के अलावा एक ERRORLEVEL कैसे लौटाया जाए।
जवाबों:
आपको sqlcmd में विकल्प -b का उपयोग करना चाहिए।
-b निर्दिष्ट करता है कि कोई त्रुटि उत्पन्न होने पर sqlcmd बाहर निकलता है और DOS ERRORLEVEL मान लौटाता है। DOS ERRORLEVEL चर पर लौटाया गया मान 1 है जब SQL सर्वर त्रुटि संदेश में 10 से अधिक गंभीरता स्तर होता है; अन्यथा, दिया गया मान 0 है
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; शायद मेरे कोड में कोई समस्या है, या शायद मेरे पर्यावरण के साथ कुछ समस्या है।
ERRORLEVEL
SQL सर्वर से रिपोर्ट की गई त्रुटि संख्या के समान मान होने की उम्मीद नहीं की जानी चाहिए। ErrorNumber एक SQL सर्वर-विशिष्ट मान है जो यह बताता है कि यह (यानी SQL सर्वर) समाप्त क्यों हुआ। दूसरी ओर, ERRORLEVEL
यह बताने के लिए कि यह (यानी SQLCMD) समाप्त करने के लिए SQLCMD- विशिष्ट मान है।