मुझे एक IronPython स्क्रिप्ट मिली है जो SQL सर्वर डेटाबेस के विरुद्ध SQL कथन का एक गुच्छा निष्पादित करता है। बयान बड़े तार होते हैं जिनमें वास्तव में "जाओ" कीवर्ड से अलग कई कथन होते हैं। यह तब काम करता है जब वे एसक्यूएल प्रबंधन स्टूडियो और कुछ अन्य टूल्स से चलते हैं, लेकिन एडीओ में नहीं। तो मैं तो जैसे 2.5 "फिर" मॉड्यूल का उपयोग कर तार विभाजित:SQL कथन पार्सिंग के लिए regex
splitter = re.compile(r'\bGO\b', re.IGNORECASE)
for script in splitter.split(scriptBlob):
if(script):
[... execute the query ...]
यह दुर्लभ मामला वहाँ शब्द एक टिप्पणी या एक स्ट्रिंग में "जाओ" है कि में टूट जाता है। मैं उस बिल्ली के आसपास कैसे काम करूंगा? यानी सही ढंग से दो लिपियों में इस स्ट्रिंग पार्स:
-- this is a great database script! go team go!
INSERT INTO myTable(stringColumn) VALUES ('go away!')
/*
here are some comments that go with this script.
*/
GO
INSERT INTO myTable(stringColumn) VALUES ('this is the next script')
संपादित करें:
मैं और अधिक खोज की है और इस एसक्यूएल प्रलेखन पाया: http://msdn.microsoft.com/en-us/library/ms188037(SQL.90).aspx
यह पता चला है के रूप में, गो होना चाहिए कुछ उत्तरों के सुझाव के रूप में अपनी लाइन पर। हालांकि इसके बाद "गिनती" पूर्णांक हो सकता है जो वास्तव में कथन बैच निष्पादित करेगा जो कि कई बार (किसी ने वास्तव में पहले इसका उपयोग किया है ??) और इसके बाद उसी पंक्ति पर एकल-पंक्ति टिप्पणियां हो सकती हैं (लेकिन नहीं बहु लाइन, मैं इस परीक्षण किया) तो जादू regex कुछ ऐसा दिखाई देगा:।
"(?m)^\s*GO\s*\d*\s*$"
इस छोड़कर खाता नहीं है के लिए:
- एक संभव एकल लाइन टिप्पणी (
"--"
किसी भी द्वारा पीछा किया एक लाइन ब्रेक को छोड़कर चरित्र) अंत में। - पूरी लाइन एक बड़ी बहु-पंक्ति टिप्पणी के अंदर है।
मैं "गिनती" तर्क को कैप्चर करने और इसका उपयोग करने के बारे में चिंतित नहीं हूं। अब जब मेरे पास कुछ तकनीकी दस्तावेज हैं, तो मैं इसे "spec" लिखने के करीब tantalizingly बंद कर रहा हूं और कभी इसके बारे में चिंता करने की ज़रूरत नहीं है।
मैं हर किसी के जवाब upmodded, सहायता के लिए धन्यवाद मैंने mcassano का जवाब दिया क्योंकि वह सुझाव देने वाला पहला व्यक्ति था कि जीओ हमेशा अपनी लाइन पर हो सकता है, जिसने मुझे उस आदेश के लिए प्रलेखन को देखने के लिए प्रेरित किया और आखिरकार एक बहुत ही आसान समाधान हुआ। –